1
votes

Incrémentation d'un élément de tableau non existant sans préavis

Je souhaite incrémenter la valeur d'un tableau, qui n'existe pas encore potentiellement.

$array = [];
$array['nonExistentYet'] = ($array['nonExistentYet'] ?? 0) + 1;

Problème

Cela conduit à un NOTICE.

J'ai trouvé un moyen de le faire, mais c'est un peu maladroit :

$array = [];
$array['nonExistentYet']++; // Notice

Question

Existe-t-il une manière plus lisible / élégante de faire cela?


0 commentaires

5 Réponses :


-1
votes

Un moyen est l'opérateur ternaire, qui vérifie si la valeur du tableau existe:

$array['iDoNotExistYet'] = empty($array['iDoNotExistYet']) ? 1 : ++$array['iDoNotExistYet'];

Une autre serait simplement de la réécrire dans if et else code> condition.


4 commentaires

Je préfère le if - ternaire est super-illisible par l'homme: D


Cela ne fonctionnera pas. Mon php attribue toujours 1 si la valeur est 1 avant. Le x ++ incrémente x à 2, mais sa valeur précédente 1 est affectée à x. Plus précisément, le résultat n'est pas défini et dépend de l'implémentation, car php peut également décider d'attribuer d'abord et ensuite d'incrémenter. Le mot clé pour cela est Point de séquence .


Il suffit de remplacer $ array ['iDoNotExistYet'] ++ par $ array ['iDoNotExistYet'] + 1 - juste une faute de frappe je suppose - mais le point était le ternaire ce qui est absolument parfait - je n'aime tout simplement pas l'utiliser à cause du bainjuice supplémentaire: D


J'ai modifié pour utiliser le préincrément, qui incrémente d'abord, puis renvoie la valeur.



2
votes

eh bien je suppose qu'une manière plus lisible serait d'utiliser if..else as,

$arr = [];
if(array_key_exists('nonExistentYet', $arr)) {
    $arr['nonExistentYet'] += 1;
}
else {
    $arr['nonExistentYet'] = 1;
}


1 commentaires

C'est plus lisible, mais encore plus maladroit - merci pour la contribution :)



0
votes

Ce que vous demandez est un peu vague, Soit la variable existe et vous l'incrémentez, soit elle n'existe pas dans ce cas, vous la créez. Dans un autre cas, supposons que vous vouliez le faire dans une boucle for, dans ce cas, vous n'avez pas à vous soucier de l'existence de la variable.


2 commentaires

Lorsque je fais un compte de groupe sur un tableau, l'élément peut ne pas exister. C'est pourquoi je l'ai dit potentiellement :)


OK je vois. Vous pouvez utiliser key_exists ($ value, $ array) pour vérifier si $ value existe dans $ array. Cette fonction renvoie vrai ou faux



2
votes

Si cela est souvent utilisé, vous pouvez définir une petite méthode d'aide, qui utilise également un effet secondaire intéressant ...

Array
(
    [nonExistentYet] => 1
)

donne ...

function inc(&$element) {
    $element++;
}
$array = [];
inc($array['nonExistentYet']);
print_r($array);

sans avertissement. Comme vous pouvez le voir, la fonction définit le paramètre comme & $ element , si cette valeur n'existe pas, elle sera créée, donc l'appel de fonction lui-même créera l'élément et ensuite il s'incrémentera simplement ça.


1 commentaires

Hein, cela ne cause pas d'avis? Mais pourquoi - ça devrait tout à fait 0_o



1
votes

Mon implémentation standard pour cela est:

@$array['nonExistentYet']++;

Mais c'est l'un des rares scénarios où j'utilise l'opérateur @ pour supprimer les avertissements, mais seulement si je avoir un contrôle total sur le tableau:

if (isset($array['nonExistentYet']))
   $array['nonExistentYet']++;
else
   $array['nonExistentYet'] = 1;

En général, il n'est pas bon de supprimer les avertissements ou les messages d'erreur!


1 commentaires

totalement banni le @ de mon codage, mais c'est en effet une bonne utilisation, merci!