2011-08-20 12 views
9

Come posso cancellare un elemento da una matrice multidimensionale dato un tasto?Elimina elemento dall'array multidimensionale in base alla chiave

Spero che questo sia avido, in modo che cancelli tutti gli elementi di una matrice che corrispondono alle chiavi che ho passato. Finora ho questo dove posso attraversare un array multidimensionale ma non posso disassemblare ho bisogno di chiave perché non ho un riferimento ad esso!

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

Penso che "il riferimento pass-by in chiamata sia stato deprecato". Soprattutto perché sto usando questo in una classe in Code-igniter. – Abs

risposta

8

Il seguente codice funziona (e non usa roba deprecato), appena provato :

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

Questo è stato molto utile, grazie a @Marian.Se qualcuno lo usa e vuole eseguire un controllo sul VALUE dell'elemento che stai rimuovendo, puoi controllare '$ value' appena prima di eseguire' unset() '; – Jimbo

0

È possibile farlo

unset($array[$key]); 

perché $array non sarà una copia della matrice originale, solo un riferimento ad essa, in modo che qualsiasi modifica terrà.

Inoltre, si è verificato un piccolo bug nel frammento: quando si effettua la chiamata ricorsiva, si dimentica di passare il parametro $keys.

+1

Solo quando si passa per riferimento ... Quale non è l'afaik predefinito ... – sg3s

+0

@ sg3s nelle nuove versioni (php5.x, non lo so per certo) è il predefinito + il pass-per-riferimento '& $ var' è deprecato. Vedi questa risposta (http://stackoverflow.com/questions/6138454/php-arrays-and-pass-by-reference) per chiarimenti. –

+0

Sono abbastanza sicuro che @ SG3 ha ragione. Il '&' in una chiamata di funzione, come 'foo (&$a);' è deprecato secondo il manuale, ma altrimenti dice 'function foo (& $ var) {'. – joakimdahlstrom

1

si potrebbe usare passaggio per riferimento, dichiarare la funzione in questo modo:

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]); 
      } 
     } 
    } 
} 

poi si può disinserire la chiave e sparirà dal valore originale passato troppo dal momento che la $array nella funzione è semplicemente un puntatore alla matrice che hai passato in modo che aggiorni quella matrice.

unset($array[$key]); 

Per ulteriori informazioni consulta la php documentation on passing by reference

+0

Ricevo questo messaggio 'Tempo di chiamata-pass-by- riferimento è stato deprecato'. Sto usando questo in una classe in Codeigniter. – Abs

+0

Ho modificato la mia risposta per includere tutta la tua funzione.Inoltre devi assicurarti che quando la chiami usi 'traverseArray ($ array, $ keys)' e ** non ** 'traverseArray (& $ array, $ keys)' – sg3s

+0

Giusto, non ricevo più quell'errore, tuttavia, la matrice è la stessa di prima.Mi sto chiedendo che funzioni davvero in una classe? Sto chiamando la funzione precedente da un'altra funzione in una classe e questa funzione non restituisce nulla. Il modo in cui la chiamo è così: '$ this-> traverseArray ($ errors, array ('e1', 'e2') ' – Abs

0

e non dimenticate di modificare foreach:

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

Non hai bisogno di farlo una volta che una variabile è referenziata, la porterà a tutti gli usi di tale variabile afaik (qualcuno si senta di testarlo?: P) – sg3s

+0

Non puoi cambiare i valori dell'array in foreach. –

+0

Qual è il motivo del downvoting? –

Problemi correlati