2009-08-01 16 views
8

Tengo dos funciones que estoy usando para agregar o eliminar barras desde un objeto/matriz combo profundamente anidados. El primer "nivel" de la matriz es siempre un objeto, pero algunas de sus propiedades pueden ser matrices u objetos.Pase de PHP por referencia en la función recursiva no funciona

Aquí están mis dos funciones:

function objSlash(&$obj, $add=true) 
{ 
    foreach ($obj as $key=>$field) 
    { 
     if (is_object($field)) 
      objSlash($field, $add); 
     else if (is_array($field)) 
      arrSlash($field, $add); 
     else if ($add) 
      $obj->$key = addslashes($field); 
     else 
      $obj->$key = stripslashes($field); 
    } 

    return; 
} 

function arrSlash(&$arr, $add=true) 
{ 
    foreach ($arr as $key=>$field) 
    { 
     if (is_object($field)) 
      objSlash($field, $add); 
     else if (is_array($field)) 
      arrSlash($field, $add); 
     else if ($add) 
      $arr[$key] = addslashes($field); 
     else 
      $arr[$key] = stripslashes($field); 
    } 

    return; 
} 

siendo llamados así:

objSlash($obj, false); 

Sin embargo, la función no elimina las barras de la matriz anidada. El objeto pasado a la función es así:

stdClass Object 
(
    [id] => 3 
    [lines] => Array 
     (
      [0] => Array 
       (
        [character] => Name 
        [dialogue] => Something including \"quotes\" 
       ) 
     ) 
) 

¿Qué he hecho mal? En algún lugar a lo largo de la línea falta una referencia ...

Respuesta

14

foreach utiliza una copia de la matriz/objeto y no la matriz/objeto en sí mismo:

Nota: A menos que la matriz es referenced, foreach opera en una copia de la matriz especificada y no la matriz sí mismo. foreach tiene algunos efectos secundarios en el puntero de matriz. No confíe en el puntero de matriz durante o después del foreach sin restablecerlo.

Así que utilice ya sea una referencia:

foreach ($arr as $key => &$field) { 
    // … 
} 

O utilice el elemento de la matriz/propiedad del objeto en sí como Kuroki Kaze sugirió utilizando $arr[$key] en lugar de su valor copiado $field.

+0

¡Gracias, '& $ field' funcionó! – DisgruntledGoat

2

foreach hace una copia del valor, supongo.

Intente utilizar objSlash($arr[$key], $add) intead de objSlash($field, $add) dentro de foreach.

+0

Creo que se refería a: objSlash ($ arr [$ key], $ add) – Josh

+0

Sí, por supuesto :) –

Cuestiones relacionadas