172 votes

PHP foreach change les valeurs originales du tableau

Je suis très novice en matière de tableaux multidimensionnels, et cela me pose un gros problème.

Mon tableau est le suivant :

$fields = array(
    "names" => array(
         "type"         => "text",
         "class"        => "name",
         "name"         => "name",
         "text_before"  => "name",
         "value"        => "",
         "required"     => true,
    )
)

Ensuite, j'ai une fonction qui vérifie si ces entrées sont remplies, si elles sont nécessaires.

function checkForm($fields){
    foreach($fields as $field){
        if($field['required'] && strlen($_POST[$field['name']]) <= 0){
            $fields[$field]['value'] = "Some error";
        }
    }
    return $fields;
}

Mon problème est la ligne suivante

$fields[$field]['value'] = "Some error";

Je veux changer le contenu du tableau d'origine, puisque je le renvoie, mais comment puis-je obtenir le nom du tableau actuel (noms dans cet exemple) dans ma boucle foreach ?

313voto

Vlad Preda Points 3846

En PHP, le passage par référence ( & ) est ... controversé. Je recommande de ne pas l'utiliser à moins de savoir pourquoi vous en avez besoin et de tester les résultats.

Je vous recommande de faire ce qui suit :

foreach ($fields as $key => $field) {
    if ($field['required'] && strlen($_POST[$field['name']]) <= 0) {
        $fields[$key]['value'] = "Some error";
    }
}

Donc, en gros, utilisez $field lorsque vous avez besoin des valeurs, et $fields[$key] lorsque vous devez modifier les données.

209voto

Dharman Points 1540

Utilisez & :

foreach($arr as &$value) {
    $value = $newVal;
}
unset($value);

& transmet une valeur du tableau comme une référence et ne crée pas une nouvelle instance de la variable. Ainsi, si vous modifiez la référence, la valeur originale sera modifiée.

Documentation PHP sur le passage par référence

Edition 2018

Cette réponse semble avoir la faveur d'un grand nombre de personnes sur Internet, c'est pourquoi j'ai décidé d'ajouter des informations supplémentaires et des mises en garde.
Alors que la méthode pass-by-reference dans foreach (ou fonctions) est une solution propre et courte, pour de nombreux débutants, cela peut être un piège dangereux.

  1. Les boucles en PHP n'ont pas de portée propre. - @Mark Amery

    Cela peut poser un sérieux problème lorsque les variables sont réutilisées dans la même portée. Une autre question de la SO illustre bien pourquoi cela peut être un problème .

  2. Comme foreach s'appuie sur le pointeur de tableau interne en PHP 5, le changer pour dans la boucle peut conduire à un comportement inattendu. - Documentation PHP pour foreach.

    La suppression d'un enregistrement ou la modification de la valeur de hachage (la clé) pendant l'itération de la même boucle peut entraîner des comportements potentiellement inattendus en PHP < 7. Le problème devient encore plus compliqué lorsque le tableau lui-même est une référence.

  3. Pour chaque performance.
    En général, PHP préfère le mode "pass-by-value" à cause de la fonctionnalité de copie sur écriture. Cela signifie qu'en interne, PHP ne crée pas de données en double, sauf si la copie doit être modifiée. Il est discutable de savoir si le pass-by-reference en foreach n'offrirait aucune amélioration des performances. Comme c'est toujours le cas, vous devez tester votre scénario spécifique et déterminer quelle option utilise le moins de mémoire et de temps CPU. Pour plus d'informations, consultez le post SO dont le lien est indiqué ci-dessous par NikiC.

  4. Lisibilité du code.
    La création de références en PHP est quelque chose qui peut rapidement devenir incontrôlable. Si vous êtes un novice et que vous ne maîtrisez pas totalement ce que vous faites, il est préférable de rester à l'écart des références. Pour plus d'informations sur & opérateur, jetez un coup d'œil à ce guide : Référence - Que signifie ce symbole en PHP ?
    Pour ceux qui veulent en savoir plus sur cette partie du langage PHP : Les références PHP expliquées

Une très belle explication technique par @NikiC de la logique interne de PHP. foreach boucles :
Comment fonctionne le "foreach" de PHP ?

16voto

k102 Points 3481

Utilisez foreach($fields as &$field){ - pour que vous puissiez travailler avec le tableau original.

Ici concerne plutôt le passage par référence.

1voto

Sagar Kadam Points 286
function checkForm(& $fields){
    foreach($fields as $field){
        if($field['required'] && strlen($_POST[$field['name']]) <= 0){
            $fields[$field]['value'] = "Some error";
        }
    }
    return $fields;
}

Voici ce que je suggérerais de faire passer par référence

-8voto

Nirmal Ram Points 827

Essayez ceci

function checkForm($fields){
        foreach($fields as $field){
            if($field['required'] && strlen($_POST[$field['name']]) <= 0){
                $field['value'] = "Some error";
            }
        }
        return $field;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X