2010-02-21 17 views
111

I iterare attraverso una matrice di oggetti e voler eliminare uno degli oggetti in base alla sua proprietà 'id', ma il mio codice non funziona.Come eliminare un oggetto dall'array all'interno del ciclo foreach?

foreach($array as $element) { 
    foreach($element as $key => $value) { 
     if($key == 'id' && $value == 'searched_value'){ 
      //delete this particular object from the $array 
      unset($element);//this doesn't work 
      unset($array,$element);//neither does this 
     } 
    } 
} 

Qualsiasi suggerimento. Grazie.

+2

possibile duplicato di [Come si rimuove un elemento di matrice in un foreach loop?] (http://stackoverflow.com/questions/1949259/how-do-you-remove-an-array-element-in-a-foreach-loop) – 7hi4g0

risposta

181
foreach($array as $elementKey => $element) { 
    foreach($element as $valueKey => $value) { 
     if($valueKey == 'id' && $value == 'searched_value'){ 
      //delete this particular object from the $array 
      unset($array[$elementKey]); 
     } 
    } 
} 
+46

È sicuro rimuovere un elemento di un array all'interno di un ciclo foreach dello stesso array? –

+14

@Oliver: in genere genera un comportamento imprevisto, ma puoi farlo in sicurezza con foreach su php. Dai una lettura qui per un test: http://php.net/manual/en/control-structures.foreach.php#88578 – pangon

+0

Questo è convertire il mio array in oggetto in CodeIgniter. Qualche suggerimento? – Paritosh

1

Non sono un programmatore php, ma posso dire che in C# non è possibile modificare un array mentre si scorre attraverso di esso. Potresti provare a utilizzare il ciclo foreach per identificare l'indice dell'elemento o gli elementi da rimuovere, quindi eliminare gli elementi dopo il ciclo.

+12

Mentre è cattiva pratica nella maggior parte delle lingue, gli array in I PHP sono fondamentalmente array associativi che possono essere ripetuti nell'ordine. L'eliminazione di un elemento precedente non cambia le chiavi degli elementi che vengono dopo di esso. –

+19

In realtà, è consentito perché la matrice che foreach utilizza internamente è una copia dell'array originale. In questo modo, la modifica dell'array originale è perfettamente sicura. – Juan

+58

In realtà, è permesso perché php è fottutamente pazzo. –

1

Sembra che la sintassi per unset non sia valida e la mancanza di reindicizzazione potrebbe causare problemi in futuro. Vedi: the section on PHP arrays.

La sintassi corretta è indicata sopra. Tieni presente anche array-values per la reindicizzazione, in modo da non indicizzare mai qualcosa che hai precedentemente eliminato.

1

Questo dovrebbe fare il trucco .....

reset($array); 
while (list($elementKey, $element) = each($array)) { 
    while (list($key, $value2) = each($element)) { 
     if($key == 'id' && $value == 'searched_value') { 
      unset($array[$elementKey]); 
     } 
    } 
} 
4

È inoltre possibile utilizzare i riferimenti su foreach valori:

foreach($array as $elementKey => &$element) { 
    // $element is the same than &$array[$elementKey] 
    if (isset($element['id']) and $element['id'] == 'searched_value') { 
     unset($element); 
    } 
} 
+4

$ (usato dentro e fuori il foreach) è solo un riferimento a ciascun elemento dell'array. unset ($ element) interromperà il riferimento, non distruggerà l'elemento di riferimento dal suo array. – Nicholas

+1

Ma '$ element = null' funzionerebbe? –

+1

@Dev_NIX '$ element = null' NON funzionerebbe, la lunghezza di' $ array' rimane la stessa, conterrebbe solo i null –