2011-08-20 52 views
9

¿Cómo puedo eliminar un elemento de una matriz multidimensional con una clave?Eliminar elemento de la matriz multidimensional según la clave

Espero que esto sea codicioso para que elimine todos los elementos en una matriz que coincida con las claves que paso. Tengo esto hasta ahora donde puedo atravesar una matriz multidimensional pero no puedo desarmar ¡clave que necesito porque no tengo una referencia!

function traverseArray($array, $keys) 
{ 
    foreach($array as $key=>$value) 
    { 
     if(is_array($value)) 
     { 
      traverseArray($value); 

     } else { 

      if(in_array($key, $keys)) 
      {      
       //unset(what goes here?) 

      } 

     } 
    } 

} 
+0

Creo que el tiempo de referencia de la llamada por referencia ha quedado obsoleto. Especialmente porque estoy usando esto en una clase en Code-encendedor. – Abs

Respuesta

8

funciona el siguiente código (y no utiliza material en desuso), acabo de probar que :

function traverseArray(&$array, $keys) { 
    foreach ($array as $key => &$value) { 
    if (is_array($value)) { 
     traverseArray($value, $keys); 
    } else { 
     if (in_array($key, $keys)){ 
     unset($array[$key]); 
     } 
    } 
    } 
} 
+0

Esto fue muy útil, gracias @Marian.Si alguien usa esto y quiere verificar el VALOR del elemento que está eliminando, puede verificar '$ value' justo antes de ejecutar' unset() '; – Jimbo

0

Usted puede hacer esto

unset($array[$key]); 

porque $array no será una copia de la matriz original, sólo una referencia a la misma, por lo que cualquier modificación sostendrán.

Además, tiene un pequeño error en su fragmento: cuando realiza la llamada recursiva, olvida el paso $keys.

+1

Sólo cuando pasa por referencia ... Que no es el afaik predeterminado ... – sg3s

+0

@ sg3s en las nuevas versiones (php5.x, no estoy seguro) es el valor predeterminado + el paso por referencia '& $ var' está en desuso. Consulte esta respuesta (http://stackoverflow.com/questions/6138454/php-arrays-and-pass-by-reference) para obtener más información. –

+0

Estoy seguro de que @ sg3 tiene razón. El '&' en una llamada de función, como 'foo (&$a);' está en desuso según el manual, pero de lo contrario dice 'function foo (& $ var) {' . – joakimdahlstrom

1

usted podría utilizar pase por referencia, declare su función como esta:

function traverseArray(&$array, $keys) 
{ 
    foreach($array as $key=>$value) 
    { 
     if(is_array($value)) 
     { 
      traverseArray($value, $keys); 
     }else{ 
      if(in_array($key, $keys)){ 
       unset($array[$key]); 
      } 
     } 
    } 
} 

entonces usted puede desarmar la llave y se desvanecerá en el valor pasado original, también, ya que la $array en la función no es más que un puntero a la matriz que pasó para que actualice esa matriz.

unset($array[$key]); 

Para más información consultar la php documentation on passing by reference

+0

Recibo este mensaje 'Call-time pass-by- la referencia ha quedado en desuso. Estoy usando esto en una clase en Codeigniter. – Abs

+0

Edité mi respuesta para incluir toda tu función. Además, debes asegurarte de que cuando la llames utilices 'traverseArray ($ array, $ keys)' y ** not ** 'traverseArray (& $ array, $ keys)' – sg3s

+0

Correcto, ya no me pasa el error. Sin embargo, la matriz es la misma que antes. Me pregunto si esto realmente puede funcionar en una clase. Estoy llamando a la función anterior de otra función en una clase y esta función no devuelve nada. La forma en que lo llamo es así: '$ this-> traverseArray ($ errors, array ('e1', 'e2')); ' – Abs

0

y no se olvide de modificar foreach:

foreach($array as $key=>&$value) 
+0

No necesita hacer esto una vez que se hace referencia a una variable, lo llevará a todos los usos de esa variable afaik (¿alguien siente para probar esto?: P) – sg3s

+0

No puede cambiar los valores de matriz en foreach. –

+0

¿Cuál es la razón para la votación negativa? –

Cuestiones relacionadas