J'ai ce tableau PHP:

$this->user_list        = array( 0 => 'Not paid',1 => 'Not paid', 2 => 'Not paid', 7 => 'Waiting, 15 => 'Waiting', 10 => 'Cancelled' );

Comment puis-je simplifier ce tableau car les numéros d'identification sont différents, mais certains d'entre eux ont le même statut?

Je l'ai essayé comme ceci:

$this->user_list        = array( [0,1,2 => 'Not paid'],[7,15 => 'Waiting'],10 => 'Cancelled' );

Mais cela ne fonctionne pas comme prévu.

Fondamentalement, je veux y parvenir:

echo $this->user_list[15] devrait me donner Attente , echo $this->user_list[10] devrait me donner Annulé , etc. Donc, cela fonctionne très bien dans mon premier tableau, je suis juste penser à y regrouper les noms en double.

0
Darksymphony 28 août 2020 à 11:57

4 réponses

Meilleure réponse

Comme mentionné par d'autres contributeurs, il n'y a pas de support natif dans la grammaire PHP pour votre cas d'utilisation prévu. Comme indiqué clairement dans la documentation PHP: Arrays:

Un tableau peut être créé en utilisant la construction de langage array (). Il prend n'importe quel nombre de paires clé => valeur séparées par des virgules comme arguments.

Donc, fondamentalement, chaque élément d'un tableau est une paire key => valeur , ce qui signifie que vous ne pouvez pas associer plusieurs clés à un seul élément.

Cela explique également pourquoi votre première tentative n'a pas fonctionné:

$this->user_list = array( [0,1,2 => 'Not paid'],[7,15 => 'Waiting'],10 => 'Cancelled' );

Si vous ne spécifiez pas de clé pour un élément, PHP utilise un index progressif (0, 1, ...). Donc, fondamentalement, dans l'exemple ci-dessus, le premier zéro n'est pas en fait une clé, mais une valeur, et PHP le lie à la clé = 0. Peut-être qu'il pourrait être plus facile pour vous de comprendre comment cela fonctionne si vous imprimez un {{X0} } ou print_r sur $this->user_list. Vous obtiendrez quelque chose de similaire à la structure suivante (REMARQUE: j'ai simplifié la structure pour la rendre plus claire):

[
  0 => [
      0 => 0
      1 => 1
      2 => "Not paid"
  ],
  1 => [
      0 => 7,
      15 => "Waiting"
  ],
  10 => "Cancelled"
]

Alors, comment pouvons-nous résoudre ce problème? Eh bien ... en fait, il n'est pas nécessaire de contorsionner la structure en échangeant des clés avec des valeurs comme semblent le suggérer d'autres contributeurs. La modification de la structure peut simplifier votre travail de "saisie de données" mais peut également créer de gros problèmes dans d'autres parties du programme car qui sait, peut-être que l'accès aux données de facturation par "ID" est simplement plus efficace que par "statut" ... ou quelque chose comme ça .

Puisque PHP ne fournit pas une telle fonctionnalité prête à l'emploi, je pense qu'une meilleure solution serait de développer notre propre fonction; un bon point de départ pourrait être celui de l'exemple ci-dessous.

function explode_array($config, $sep = ',') {
    $res = [];
    foreach($config as $configKey => $value) {
        // split key values
        $keys = explode($sep, $configKey);
        foreach($keys as $key) {
            $res[$key] = $value;
        }
    }
    return $res;
}

$config = [
    '0,1,2' => 'Not paid',
    '7,15' => 'Waiting',
    '10' => 'Cancelled'
];
$myArr = explode_array($config);
print_r($myArr);

L'idée est assez simple: comme nous ne pouvons pas utiliser un tableau comme clé, nous exploitons le meilleur type de données suivant, à savoir une chaîne CSV. Veuillez noter qu'il n'y a pas de gestion des erreurs dans le code ci-dessus, donc la première chose que vous voudrez peut-être faire est d'ajouter un code de validation à la fonction explode_array (ou comment vous souhaitez le nommer) .

1
Dharman 31 août 2020 à 12:49

Comme indiqué dans les commentaires, vous ne pouvez pas avoir plusieurs clés avec une valeur. Le meilleur moyen est d'utiliser la construction keyword => [ number, number, number...].

//set a result array
$result = [];

//loop the original array
foreach ( $this->user_list as $number => $keyword ){
  //if the keyword doesn't exist in the result, create one
  if(!isset ( $result [ $keyword ] ) ) $result[ $keyword ] = [];
  //add the number to the keyword-array 
  $result[ $keyword ] [] = $number;
}
0
Michel 28 août 2020 à 10:35

PHP n'a pas de fonction ou de structure intégrée pour gérer des cas comme celui-ci. J'utiliserais une simple fonction de clonage de valeurs de tableau pour mapper vos doublons. Ayez simplement une instance de chaque statut, puis mappez les alias, puis exécutez une fonction qui les clone. Comme suit:

// Status list:
$ulist = [ 0 => 'Not paid', 7 => 'Waiting', 10 => 'Cancelled' ];

// Alternative IDs list, mapped to above source IDs:
$aliases = [ 0 => [1,2], 7 => [15] ];

// Function to clone array values:
function clone_values(array &$arr, array $aliases)
{
    foreach($aliases as $src => $tgts) {
        foreach($tgts as $tgt) {
            $arr[$tgt] = $arr[$src];
        }
    }
    ksort($arr); // If the order matters
}

// Let's clone:
clone_values($ulist, $aliases);

Cela donne le tableau suivant:

array(6) {
    [0] · string(8) "Not paid"
    [1] · string(8) "Not paid"
    [2] · string(8) "Not paid"
    [7] · string(7) "Waiting"
    [10] · string(9) "Cancelled"
    [15] · string(7) "Waiting"
}

.... auquel vous pouvez accéder comme vous vous y attendez, ici $ulist[2] => Not paid, etc. Si le cas d'utilisation est aussi simple que celui illustré dans l'OP, je l'écrirais personnellement comme est. Il n'y a pas de complexité dramatique à cela. Cependant, si vous avez des dizaines d'alias, le mappage et le clonage commencent à avoir un sens.

1
Markus AO 31 août 2020 à 13:18

Vous devriez utiliser comme ça. si le numéro d'identification est l'identifiant de la facture ou autre chose et qu'une autre valeur est son statut.

 $arr = array( 
   'Not paid' => [0,1,2] , 
   'Waiting' => [5,6],
   'Cancelled' =>[8]
);



foreach($arr as $key => $val){
 foreach($val as $keys => $vals){
 echo   "invoiceid ".$vals ." status ".$key;
 echo"<br>";
 }
}

// pour un seul statut que vous pouvez utiliser comme celui-ci

foreach($arr['Not paid'] as $key => $val){
 echo $val;
echo"<br>";
}

Essayez simplement de l'exécuter et vérifiez la sortie.

1
Amit kumar 28 août 2020 à 10:55