2009-05-28 14 views
1

Gibt es eine Möglichkeit, durch ein Array zu durchlaufen, aber eine Operation für jedes andere Element durchzuführen? ie Wenn ich ein Array mit 13 Elementen habe, wie mache ich etwas nur zu den Elementen 2,4,6,8,10 und 12?selektive Iteration von Array in PHP

Antwort

0

zu beheben cletuses Antwort für mehr Geschwindigkeit und beheben Fehler:

for ($i = 1, $j = count($array); $i < $j; $i += 2) { 
    // code 
} 
+0

Daraus gelernt, wusste ich nicht, dass Sie mehr als eine Variable im ersten Ausdruck (oder nachfolgenden) zuweisen können. Vielen Dank! –

+2

Geschwindigkeit? Das "Caching" der Array-Größe ist bestenfalls eine Mikro-Optimierung. Es ist auch semantisch äquivalent. Was ist, wenn sich die Array-Größe während der Schleife ändert? – cletus

+0

@phil, np. froh zu helfen :) @cletus, wenn Ihr Array während der Schleife ändert, sollten Sie eine Foreach verwenden oder $ j in der Schleife aktualisieren. Es ist eine Geschwindigkeitsoptimierung und eine gültige. Stellen Sie sich ein Array von 1000000 Werten vor, dann sehen Sie, was ich meine. – Ozzy

1
for ($i=1; $i<sizeof($array); $i+=2) { 
    // do stuff to $array[$i] 
} 

Sie können es in einer foreach-Schleife integrieren:

$i = 0; 
foreach ($array as $v) { 
    if ($i++ & 1) continue; 
    // do stuff to $v 
} 

Hinweis:$i & 1-($i % 2) == 1 entspricht (oder nur $i % 2).

+0

sollte der letzte Teil der Anweisung $ i + = 2 sein? – musoNic80

+0

nicht sicher, ich bekomme das Beispiel foreach. Kannst du es mir etwas einfacher erklären ?! – musoNic80

+1

Grundsätzlich hat eine foreach() - Schleife, im Gegensatz zu einer normalen for() -Schleife, keinen Indexzähler, so dass $ i als Ersatzindex verwendet wird. Es wird bei jeder Iteration erhöht. $ i & 1 gibt true für die Werte 1, 3, 5, 7 zurück. Es beginnt bei 0, so dass es für jedes zweite Element wahr wird (was bedeutet, dass sie übersprungen werden). – cletus

3
foreach($array as $val) { 
    if(($i++ % 2) == 0) { 
    ...do stuff here... 
    } 
} 
+0

So würde ich es machen, bis auf die Zahnspange. Die Logik ist tot einfach und dies spiegelt das schön und es macht es einfach, mit einem anderen zu erweitern, ohne die Schleifenlogik neu zu schreiben. – Kris

+0

Antworten sind großartig, danke. Kann ich ein Beispiel aus der realen Welt hinzufügen? Ich habe ein Array mit 2 Elementen für jeden Tag der Woche. (Nummerierung beginnt bei 0). Ich möchte eine Schleife, die an jedem Tag etwas tut, nicht an jedem Element. Wie kann ich die Antworten verwenden, die Sie gegeben haben, um dies zu erreichen? PS: Es gibt noch keinen Code zum Posten, ich versuche nur, es zuerst herauszufinden !!! – musoNic80

+0

Wenn Ihr Array ähnlich aussieht $ array = array ('mon1', 'mon2', 'tue1', 'tue2' ... 'fri2'); und folgt immer einem eindeutigen Muster, dann können Sie diesen Code verwenden, wie er geschrieben ist. Wenn du sicherstellen willst, dass es jeden Tag ankommt, musst du es irgendwie bestätigen. Es ist schwer zu sagen, ohne wirklich zu wissen, was reingeht und was du willst. –

0

Eine weitere Variation der Antworten bereits gebucht ... Ähnlich wie Phil Carter Antwort. Wenn das Array einen numerischen Index hat, können Sie das in der foreach verwenden, anstatt eine separate Zählervariable zu verwalten:

foreach ($array as $i => $v) { 
    if (! ($i % 2)) { 
    // do stuff to $v 
}