Je me demandais s'il était possible de modifier l'objet actuel qui est géré dans une foreach
boucle
Je travaille avec un tableau d'objets $questions
et je veux parcourir et rechercher les réponses associées à cet objet question dans ma base de données. Donc, pour chaque question, allez chercher les objets de réponse et mettez à jour le courant $question
dans ma foreach
boucle afin que je puisse sortir / traiter ailleurs.
foreach($questions as $question){
$question['answers'] = $answers_model->get_answers_by_question_id($question['question_id']);
}
Réponses:
Il y a 2 façons de faire cela
De cette façon, vous enregistrez la clé, vous pouvez donc la mettre à jour à nouveau dans la
$questions
variable principaleou
L'ajout de
&
gardera le$questions
mis à jour. Mais je dirais que le premier est recommandé même s'il est plus court (voir commentaire de Paystey)Selon la
foreach
documentation PHP :la source
foreach
sont vraiment pas recommandées, la façon dont lesforeach
passages autour de la partie valeur de la boucle se traduisent par un comportement imprévisible. Cela peut être plus long, mais vous êtes beaucoup plus en sécurité en utilisant la méthode 1 ici.foreach
propos de l'horreur comme celle-ci: stackoverflow.com/questions/3307409 /... (@Nico, FYI, aussi.)Sûrement utiliser
array_map
et si utiliser un conteneur implémentéArrayAccess
pour dériver des objets est juste un moyen plus intelligent et sémantique de procéder?La sémantique de la carte de tableau est similaire dans la plupart des langages et implémentations que j'ai vus. Il est conçu pour renvoyer un tableau modifié basé sur l'élément du tableau d'entrée (haut niveau ignorant la préférence de type de compilation / d'exécution du langage); une boucle est censée exécuter plus de logique.
Pour récupérer des objets par ID / PK, selon que vous utilisez SQL ou non (cela semble suggéré), j'utiliserais un filtre pour m'assurer d'obtenir un tableau de PK valides, puis imploser avec une virgule et placer dans une
IN()
clause SQL pour renvoie l'ensemble de résultats. Il effectue un appel au lieu de plusieurs via SQL, optimisant un peu lecall->wait
cycle. Plus important encore, mon code se lirait bien à quelqu'un de n'importe quelle langue avec un certain degré de compétence et nous ne rencontrons pas de problèmes de mutabilité.contre
Si vous savez ce que vous faites, vous n'aurez jamais de problèmes de mutabilité (en gardant à l'esprit si vous avez l'intention d'écraser,
$arr
vous pouvez toujours$arr = array_map
et être explicite.la source