2010-07-12 3 views
44

Ich schreibe eine foreach, die nicht am 0. Index beginnt, sondern beginnt am ersten Index meines Arrays. Gibt es eine Möglichkeit, den Startpunkt der Schleife auszugleichen?Wie starte ich eine foreach-Schleife bei einem bestimmten Index in PHP

+12

Wäre es nicht besser, wenn Sie sich für stattdessen verwenden? – Prix

+3

Die Handhabung der Schlüssel-Wert-Paare ist in einer foreach-Schleife viel einfacher und ich denke, das ist die Resaon, die er für eine foreach nehmen wollte. Oder er hat sogar eine Foreach und möchte nicht viel Code ändern. – 2ndkauboy

Antwort

2

In einer foreach können Sie das nicht tun. Es gibt nur zwei Möglichkeiten, zu bekommen, was Sie wollen:

  1. ein for-Schleife verwenden und an Position 1
  2. startet foreach verwenden und so etwas wie if ($ key> 0) verwenden um den eigentlichen Code

Eine Foreach macht, was ihr Name Ihnen sagt. Etwas für jedes Element tun :)

EDIT: OK, eine sehr böse Lösung kam gerade zu meinen Verstand. Versuchen Sie folgendes:

foreach(array_reverse(array_pop(array_reverse($array))) as $key => $value){ 
    ... 
} 

Das würde das Array umkehren, das letzte Element herausspringen und es wieder umkehren. Dann haben Sie ein Element, das das erste Element ausschließt.

Aber ich würde empfehlen, eine der anderen Lösungen zu verwenden. Das Beste wäre das Erste.

Und eine Variante: Sie können array_slice() dafür verwenden:

foreach(array_slice($array, 1, null, true) as $key => $value){ 
    ... 
} 

Aber Sie sollten alle drei Parameter verwenden, um die Schlüssel des Arrays für Ihre foreach-Schleife zu halten:

+0

mit array_slice ist es möglich, dies in einer foreach-Schleife zu tun, aber diese Praxis sollte stark entmutigt und strafbar sein durch das Lesen dieser Art von Code. – Kris

+0

Deshalb habe ich darauf hingewiesen, dass es eine EVIL-Methode ist, das zu tun. Aber ich würde keines der Solutos persönlich benutzen. Ich würde eine if-Anweisung oder eine for-Schleife verwenden. – 2ndkauboy

13

können Sie verwenden die array_slice Funktion:

$arr = array(); // your array 
foreach(array_slice($arr, 1) as $foo){ 
    // do what ever you want here 
} 

natürlich können Sie, was Offset-Wert Sie wollen. In diesem Fall "1" überspringen Sie das erste Element des Arrays.

+0

Nichts wert, dass dies eine Kopie dieses Chunks des Arrays erfordert. Könnte eine schlechte Sache sein, wenn das Array groß ist. –

+0

Sie haben Recht ... das funktioniert besser für kurze Arrays. Vielen Dank für Ihren Kommentar. – Cristian

1

Scheinen, wie ein for-Schleife wäre der bessere Weg sein, hier zu gehen, aber wenn Sie denken, Sie foreach verwenden, müssen Sie das erste Element aus dem Array verschieben könnten und es auf unshift zurück:

$a = array('foo','bar'); 
$temp = array_shift($a); 
foreach ($a as $k => $v) { 
    //do something 
} 
array_unshift($a, $temp); 
es
+0

Man beachte nur, dass die Syntax $ k => $ v nur für assoziative Arrays gilt. Für indizierte Arrays möchten Sie nur $ a als $ v. –

+0

@Michael: Das $ k => $ v funktioniert auch für indizierte Arrays und gibt die Indexnummer des aktuellen Wertes zurück. – 2ndkauboy

+0

Oh ... cool! : D lol –

67

Halt einfach.

foreach ($arr as $k => $v) { 
    if ($k < 1) continue; 
    // your code here. 
} 
+1

Ich mag diese Lösung. Ist es weiterhin mit jeder Version von PHP verfügbar? – 2ndkauboy

+1

http://ie2.php.net/manual/en/control-structures.continue.php erwähnt nicht, wann es verfügbar wurde, also nehme ich an, dass es von Anfang an da war. – TRiG

+1

und, wenn das Array nicht indiziert ist? – Cristian

27

A Foreach wird das Array zurück:

Hinweis: Bei foreach ersten Mal ausgeführt wird, der interne Zeiger wird automatisch zurückgesetzt, um das erste Element des Arrays. Das bedeutet, dass Sie vor einer foreach-Schleife reset() nicht aufrufen müssen.

Entweder eine for Schleife verwenden

$letters = range('a','z'); 
for($offset=1; $offset < count($letters); $offset++) { 
    echo $letters[$offset]; 
} 

oder eine while Schleife (nur wenn dies nicht eine assoziative Array ist)

$letters = range('a','z'); 
next($letters); 
while($letter = each($letters)) { 
    echo $letter['value']; 
} 

oder mit einem (kann eine beliebige Anordnung sein) LimitIterator

$letters = new LimitIterator(new ArrayIterator(range('a','z')), 1); 
foreach($letters as $letter) { 
    echo $letter; 
} 

, mit dem Sie Start Offset und Count durch den Konstruktor angeben können.

des oben Gibt alle Buchstaben b bis z statt a bis z

0

Nun keinen Körper gesagt, aber wenn Sie nichts dagegen haben, um das Array zu verändern und wenn wir wollen, von dem zweiten Element starten die gegebene Array:

unset($array[key($array)]); 
foreach($array as $key=>$value) 
{ 
    //do whatever 
} 

, wenn Sie nichts dagegen haben, fügen Sie einfach,

$saved = $array; 
unset($array[key($array)]); 
foreach($array as $key=>$value) 
{ 
    //do whatever 
} 
$array = $saved; 

Außerdem, wenn Sie einen bestimmten bekannten Index überspringen wollen, subtitute nur

key($array) 

von dem angegebenen Index

Verwandte Themen