2012-07-23 10 views
5

PHP tiene algunas funciones geniales (como array_walk) que le permiten procesar cada elemento de una matriz. Por lo general, están configurados de modo que especifique la matriz que desea procesar como primer parámetro y una función de devolución de llamada para aplicar a cada elemento como el segundo. Estas funciones devuelven booleanos que indican éxito, no una copia de la matriz modificada como cabría esperar. Si desea que se modifique la matriz, debe pasar la matriz por referencia como array_walk(&$my_array, 'my_callback');Usando funciones como array_walk (y funciones similares) para modificar matrices en PHP> = 5.3

Sin embargo, en PHP 5.3 y posteriores, si pasa por referencia a la función de llamada, obtendrá un error E_DEPRECATED.

¿Alguien sabe (si existe) una forma correcta de utilizar estas funciones para modificar matrices sin activar los errores y sin suprimirlos explícitamente? ¿Hay nuevas alternativas a estas antiguas funciones de procesamiento de matrices?

Respuesta

7

Los valores se pasan por referencia implícita en PHP> = 5.3 según lo determinado por la definición de función.

definición de función para array_walk():

bool array_walk (array &$array , callable $funcname [, mixed $userdata = NULL ]) 

Nota &$array. Como tal, no es necesario pasar explícitamente la matriz por referencia en la llamada a la función en PHP> = 5.3.

array_walk($my_array, 'my_callback'); 

Sin embargo, usted tendrá que asegurarse de que la devolución de llamada acepta que es el valor por referencia en consecuencia (como se demuestra por nickb).

también echar un vistazo a PHP 5.4 Call-time pass-by-reference - Easy fix available?

+0

Ah ... gracias, tiene sentido. Matiz interesante: no puede llamar por referencia, pero puede definir una función/método con argumentos a los que se hace referencia. http://php.net/manual/en/language.references.pass.php ¡Todavía deseo que esas funciones devuelvan copias de arreglos modificados o null en lugar de booleanos! – Ray

+0

Sí, exactamente. Me alegro de ayudar. –

6

Porque debe definir la devolución de llamada para aceptar su parámetro por referencia para modificar la matriz.

array_walk($my_array, function(&$el, $key) { $el = $el/2; }); 

Así, un ejemplo rápido de esta manera:

$my_array = range(2, 10, 2); 
array_walk($my_array, function(&$el, $key) { $el = $el/2; }); 
var_dump($my_array); 

Will output:

array(5) { 
    [0]=> 
    int(1) 
    [1]=> 
    int(2) 
    [2]=> 
    int(3) 
    [3]=> 
    int(4) 
    [4]=> 
    int(5) 
} 
+0

gracias por los comentarios, pero Jasons respuesta a continuación lo que sumado a su hizo en la edición de referencia más clara. ¡Aún así obtuviste un aval de mi parte! – Ray

+0

+1 de mí también para el ejemplo. –

Cuestiones relacionadas