Me preguntaba si es posible editar el objeto actual que se maneja dentro de un foreach
bucle
Estoy trabajando con una matriz de objetos $questions
y quiero revisar y buscar las respuestas asociadas con ese objeto de pregunta en mi base de datos. Entonces, para cada pregunta, busque los objetos de respuesta y actualice la corriente $question
dentro de mi foreach
ciclo para que pueda generar / procesar en otro lugar.
foreach($questions as $question){
$question['answers'] = $answers_model->get_answers_by_question_id($question['question_id']);
}
Respuestas:
Hay 2 formas de hacer esto
De esta forma guardas la clave, para que puedas actualizarla nuevamente en la
$questions
variable principalo
Agregar el
&
mantendrá$questions
actualizado el. Pero yo diría que se recomienda el primero aunque sea más corto (ver comentario de Paystey)Según la
foreach
documentación de PHP :fuente
foreach
Realmente no se recomiendan las referencias en , la forma en que lasforeach
transferencias alrededor de la parte de valor del ciclo dan como resultado un comportamiento impredecible. Puede ser más largo, pero está mucho más seguro si usa el método 1 aquí.foreach
, con respecto al horror como este: stackoverflow.com/questions/3307409/… (@Nico, FYI, también.)Seguramente usar
array_map
y si usar una implementación de contenedorArrayAccess
para derivar objetos es solo una forma más inteligente y semántica de hacerlo.La semántica del mapa de matriz es similar en la mayoría de los lenguajes e implementaciones que he visto. Está diseñado para devolver una matriz modificada basada en el elemento de matriz de entrada (alto nivel que ignora la preferencia de tipo de compilación / tiempo de ejecución del lenguaje); un bucle está destinado a realizar más lógica.
Para recuperar objetos por ID / PK, dependiendo de si está usando SQL o no (parece sugerido), usaría un filtro para asegurarme de obtener una matriz de PK válidos, luego implosionar con una coma y colocarlo en una
IN()
cláusula SQL para devuelve el conjunto de resultados. Realiza una llamada en lugar de varias a través de SQL, optimizando un poco elcall->wait
ciclo. Lo más importante es que mi código se leerá bien para alguien de cualquier idioma con un grado de competencia y no nos encontremos con problemas de mutabilidad.vs
Si sabe lo que está haciendo, nunca tendrá problemas de mutabilidad (teniendo en cuenta que si tiene la intención de sobrescribir
$arr
, siempre podría$arr = array_map
ser explícito.fuente