Soy muy nuevo en arreglos multidimensionales, y esto me está molestando a lo grande.
Mi matriz es la siguiente:
$fields = array(
"names" => array(
"type" => "text",
"class" => "name",
"name" => "name",
"text_before" => "name",
"value" => "",
"required" => true,
)
)
Luego obtuve una función que verifica si estas entradas están llenas, si son necesarias.
function checkForm($fields){
foreach($fields as $field){
if($field['required'] && strlen($_POST[$field['name']]) <= 0){
$fields[$field]['value'] = "Some error";
}
}
return $fields;
}
Ahora mi problema es esta línea
$fields[$field]['value'] = "Some error";
Quiero cambiar el contenido de la matriz original, ya que estoy devolviendo esto, pero ¿cómo obtengo el nombre de la matriz actual (nombres en este ejemplo) en mi bucle foreach?
Respuestas:
En PHP, pasar por referencia (
&
) es ... controvertido. Recomiendo no usarlo a menos que sepa por qué lo necesita y pruebe los resultados.Yo recomendaría hacer lo siguiente:
Básicamente, utilícelo
$field
cuando necesite los valores y$fields[$key]
cuando necesite cambiar los datos.fuente
foreach
debería ser controvertido? No es como si fuera una llamada de función con efectos secundarios ocultos ni nada.Uso
&
:&
pasa un valor de la matriz como referencia y no crea una nueva instancia de la variable. Por lo tanto, si cambia la referencia, el valor original cambiará.http://php.net/manual/en/language.references.pass.php
Editar 2018
Esta respuesta parece ser favorecida por muchas personas en Internet, por eso decidí agregar más información y palabras de precaución.
Si bien el paso por referencia en
foreach
(o funciones) es una solución limpia y corta, para muchos principiantes esto podría ser una trampa peligrosa.Esto podría ser un problema grave cuando las variables se están reutilizando en el mismo ámbito. Otra pregunta SO ilustra muy bien por qué eso podría ser un problema.
Desarmar un registro o cambiar el valor hash (la clave) durante la iteración en el mismo bucle podría conducir a comportamientos potencialmente inesperados en PHP <7. El problema se complica aún más cuando la matriz en sí misma es una referencia.
Foreach rendimiento.
En general, PHP prefiere pasar por valor debido a la función de copia en escritura. Significa que PHP internamente no creará datos duplicados a menos que la copia de los mismos necesite ser cambiada. Es discutible si pasar por referencia en
foreach
ofrecería una mejora en el rendimiento. Como siempre es el caso, debe probar su escenario específico y determinar qué opción usa menos memoria y tiempo de CPU. Para obtener más información, consulte la publicación SO vinculada a continuación por NikiC.Legibilidad de código.
Crear referencias en PHP es algo que rápidamente se sale de control. Si es un novato y no tiene control total de lo que está haciendo, es mejor mantenerse alejado de las referencias. Para obtener más información sobre el
&
operador, consulte esta guía: Referencia: ¿Qué significa este símbolo en PHP?Para aquellos que quieran aprender más sobre esta parte del lenguaje PHP : Referencias PHP explicadas
Una explicación técnica muy agradable por @NikiC de la lógica interna de los bucles foreach de PHP:
¿Cómo funciona realmente el 'foreach' de PHP?
fuente
unset($value);
después delforeach
corchete de cierre, para garantizar que la variable de referencia ya no esté disponible después de la iteración. 3v4l.org/2V2AQUso
foreach($fields as &$field){
: para trabajar con la matriz original.Aquí hay más sobre pasar por referencia.
fuente
Esto es lo que sugeriría pasar por referencia
fuente
$fields
?Prueba esto
fuente