Remplacer un tableau dans une boucle foreach par un tableau modifié dans la même boucle

StackOverflow https://stackoverflow.com/questions/229491

  •  04-07-2019
  •  | 
  •  

Question

foreach($arrayOne as $value){
    do function
}

Dans l'exemple ci-dessus, j'aimerais passer $ arrayOne à une boucle, utiliser une fonction qui supprime certains éléments de $ arrayOne, puis laisser la boucle passer sur le $ arrayOne réduit sur les éléments restants jusqu'à la la boucle retourne faux.

Des recommandations?

Était-ce utile?

La solution

Si vous souhaitez modifier la valeur des éléments du tableau, utilisez-le par référence. Si vous souhaitez supprimer entièrement les éléments du tableau, séparez les paires clé / valeur.

$arrayOne = array('example', 'listing of', 'stuff');

foreach ($arrayOne as $key => &$value) {
    $value .= ' alteration';

    if ($value == 'listing of alteration') {
        unset($arrayOne[ $key ]);
    }

}

Le code ci-dessus ajoutera le texte " modification " à la fin de chaque élément du tableau. Il supprimera également le deuxième index lorsqu'il correspond à la "liste de modification". Testé sur PHP 5.2

Autres conseils

Avez-vous simplement besoin d’une fonction pour supprimer certains éléments d’un tableau?

Si tel est le cas, vous pouvez utiliser array_filter .

Je recommanderais d'avoir deux tableaux,
un avec les données - dataarray,
l'autre initialement vide - emptyarray
et tout ce qui est admissible dans le premier foreachloop, placez-le dans le deuxième tableau et, à la fin, videz le premier tableau, permutez les identifiants des deux tableaux (dataarray devient emptyarray et vice-versa) et répétez jusqu'à ce que vous retourniez false ou autre chose. / p>

Rabbit a la bonne réponse pour utiliser des références pour modifier des valeurs et un index à supprimer dans une boucle foreach (je vous voterais mais c’est mon premier message donc je n’ai pas encore 15 répétitions, désolé)

n'oubliez pas d'utiliser la référence si vous la transmettez à une fonction qui doit également modifier la valeur. Vous devez également passer le tableau en tant que référence si vous souhaitez en supprimer la valeur.

Je vous conseillerais de renvoyer la fonction booléen à la suppression éventuelle afin d'éviter de créer davantage de références. par exemple

foreach ($array AS $key => &$value) {
    //& reference only needed if execFunction must edit $value
    if (execFunction(&$value)) { 
        unset($array[$key]);
    } else {
        $value['exec_failed']+=1;
    }
}
unset($value);

La référence $ valeur persistera également au-delà de la portée de la boucle, ainsi le non défini final.

Une dernière pensée, vous avez eu l’impression de vouloir parcourir le tableau plusieurs fois. Veillez bien à ce que votre boucle cesse de s'exécuter.

Merci à tous pour leur aide. La fonction unset () est finalement ce qui m'est utile dans le besoin spécifique d'aujourd'hui. Voici la courte histoire de mon utilisation de unset ():

//array to be processed
$one=array('1','2','3');
//array of terms previously defined as a group to compare against
$against=array('1','2');

foreach($one as $key=>$value){

    //pull out matching terms   
    $match=array_intersect($one,$against);
    //my need is to sum grouped numbers
    $sum=array_sum($match);
    echo $sum."<br />";

    //remove matching terms from original array
    foreach($match as $key=>$value){
        unset($one[$key]);
    }
}
//now a parent looping function will process the remaining array elements. In this case, the only one left is '3'.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top