2010-05-17 12 views
15

So, hier ist mein Code:Unset Array-Element innerhalb einer foreach-Schleife

<?php 

$arr = array(array(2 => 5), 
      array(3 => 4), 
      array(7 => 10)); 

foreach ($arr as $v) { 
    $k = key($v); 
    if ($k > 5) { 
     // unset this element from $arr array 
    } 
} 

print_r($arr); 

// now I would like to get the array without array(7 => 10) member 

Wie Sie sehen können, habe ich mit einer Reihe von einzelnen Taste Start => Wert Arrays, ich Schleife durch diese Anordnung und einen Schlüssel erhalten des aktuellen Elements (das ein einzelnes Element-Array ist).

Ich muss Elemente des Arrays mit Schlüssel höher als 5, wie konnte ich das tun? Ich muss möglicherweise auch Elemente mit einem Wert von weniger als 50 oder anderen Bedingungen entfernen. Grundsätzlich muss ich in der Lage sein, einen Schlüssel des aktuellen Array-Elements zu erhalten, das selbst ein Array mit einem einzelnen Element ist.

+1

möglich Duplikat von [Wie entfernen Sie ein Array-Element in einer foreach-Schleife?] (Http://stackoverflow.com/questions/1949259/how-do-you-remove-an-array-element-in-a- -foreach-loop) – 7hi4g0

Antwort

39
foreach($arr as $k => $v) { 
    if(key($v) > 5) { 
     unset($arr[$k]); 
    } 
} 
+1

facepalm ... Ich habe die $ k => $ v Syntax für einen Moment total vergessen, mein Gedächtnis wird immer schlechter. –

+1

Was ist der Unterschied in der Verwendung von $ k und Schlüssel ($ v), sind sie nicht gleich? Frage nur, weil jedes Beispiel unten auch Schlüssel ($ v) verwendet, weiß nicht warum, wenn ich denke, dass $ k direkt verwendet werden kann. – Haider

+1

@Haider Sie missverstehen nur, wofür 'key ($ v)' verwendet wird. Es erhält den Schlüssel des Sub-Arrays, das '$ v' ist, und nicht irgendwelche Schlüssel des Arrays, über die iteriert wird. Für das erste Element '$ k == 0',' $ v == Array (2 => 5) 'und' Schlüssel ($ v) == 2'. – cincodenada

2

Verwenden Sie key(), um den ersten Schlüssel aus dem Unterfeld abzurufen.

foreach($arr as $k => $v) { 
    if(key($v) > 5) { 
     unset($arr[$k]); 
    } 
} 
+0

Zu welcher Person auch immer diese Variable abgelehnt wurde, darf ich nachfragen, warum? – Amber

+0

Hey, du hast eine bearbeitete Antwort und kopierst meine Antwort :) – sasa

+0

Ähm, nein, ich war mir deiner Antwort wirklich nicht bewusst, als ich meine Antwort bearbeitet habe. Die Tatsache, dass die beiden Antworten die gleichen sind, liegt eher daran, dass die Grundhaftigkeit der Aufgabe dazu führt, dass sie von vielen Menschen auf die gleiche Weise gemacht wird (das Innere der Schleife ist im Wesentlichen dasselbe wie zuvor, als ich es bearbeitet habe; das Äußere ist so ziemlich der Standard für 'foreach'-Schleifen. – Amber

0

Es ist nicht wirklich sicher aus einer Sammlung hinzuzufügen oder zu löschen, während sie durch das Iterieren. Wie wäre es, wenn Sie die gewünschten Elemente zu einem zweiten Array hinzufügen und dann das Original löschen?

+2

'foreach'-Schleifen in PHP durchlaufen eine Kopie des standardmäßig bereitgestellten Arrays (es sei denn, es wird explizit durch Referenz übergeben). – Amber

+1

Referenz vs Kopie war nicht mein Punkt, noch relevant. Es ist eine schlechte Form, ein Array während der Iteration zu mutieren. –

+0

Aber warum ist nicht sicher? – sasa

14

Es ist sicher in PHP Elemente aus einem Array zu entfernen, während darüber Iterieren foreach Schleife:

foreach ($arr as $key => $value) { 
    if (key($value) > 5) { 
     unset($arr[$key]); 
    } 
} 
+2

Beachten Sie, dass dies nicht das tut, was das OP will (aber Ihr Punkt ist größtenteils korrekt - es ist sicher, dies im Kontext einer 'foreach'-Schleife zu tun; andere Formen der Iteration sind nicht immer add/remove-safe) . – Amber

+0

@Amber, danke, ich habe die Tatsache verpasst, dass Array von Arrays gegeben ist, habe ich das Beispiel korrigiert. Außerdem wurde ein Hinweis zur 'foreach'-Schleife hinzugefügt. –

0

Um ungesetzt Array-Element uns nicht gesetzt() verwendet und PHP-Funktion wie unten:

foreach($array as $key=>$value) 
{ 
    if(key($value) > 5) 
    { 
     unset($array[$key]); 
    } 
}