Eu queria saber se é possível editar o objeto atual que está sendo tratado dentro de um foreach
loop
Estou trabalhando com uma série de objetos $questions
e quero examinar e procurar as respostas associadas a esse objeto de pergunta em meu banco de dados. Então, para cada pergunta, vá buscar os objetos de resposta e atualize a corrente $question
dentro do meu foreach
loop para que eu possa produzir / processar em outro lugar.
foreach($questions as $question){
$question['answers'] = $answers_model->get_answers_by_question_id($question['question_id']);
}
Respostas:
Existem 2 maneiras de fazer isso
Desta forma, você salva a chave, para que possa atualizá-la novamente na
$questions
variável principalou
Adicionar o
&
manterá o$questions
atualizado. Mas eu diria que o primeiro é recomendado, embora seja mais curto (veja o comentário de Paystey)De acordo com a
foreach
documentação do PHP :fonte
foreach
realmente não são recomendadas, a maneira como oforeach
passa ao redor da parte do valor do loop resulta em um comportamento imprevisível. Pode demorar mais, mas você está muito mais seguro usando o método 1 aqui.foreach
, sobre terror como este: stackoverflow.com/questions/3307409/… (@Nico, FYI, também.)Certamente, usar
array_map
e se usar uma implementação de contêinerArrayAccess
para derivar objetos é apenas uma maneira mais inteligente e semântica de fazer isso?A semântica do mapa de matriz é semelhante na maioria das linguagens e implementações que vi. Ele é projetado para retornar uma matriz modificada com base no elemento da matriz de entrada (alto nível ignorando a preferência de tipo de compilação / tempo de execução da linguagem); um loop destina-se a realizar mais lógica.
Para recuperar objetos por ID / PK, dependendo se você está usando SQL ou não (parece sugerido), eu usaria um filtro para garantir que obtivesse uma matriz de PKs válidos, então implodiria com vírgula e colocaria em uma
IN()
cláusula SQL para retorna o conjunto de resultados. Ele faz uma chamada em vez de várias via SQL, otimizando um pouco ocall->wait
ciclo. Mais importante ainda, meu código seria lido bem para alguém de qualquer linguagem com um grau de competência e não enfrentamos problemas de mutabilidade.vs
Se você sabe o que está fazendo, nunca terá problemas de mutabilidade (tendo em mente que se você pretende sobrescrever,
$arr
você pode sempre$arr = array_map
e ser explícito.fonte