Pewnie dla wielu osób, które z php mają do czynienia od dłuższego czasu, ten wpis nie będzie niczym odkrywczym.
Czym różni się foreach() od for()? W wielu przypadkach nie ma żadnej różnicy dla logiki aplikacji, której pętli się stosuje i można je stosować zamiennie bez wpływu na jej działanie.
Więc gdzie jest różnica? Otóż foreach() przechodzi po elementach tablicy w kolejności dodawania wartości, natomiast for() jest używany do iterowania tablicy w zdefiniowany przez nas sposób.
Poniższy kod wyjaśnia wszystko:
<?php $a = array(); $a[3] = 'a'; $a[1] = 'b'; $a[0] = 'c'; $a[2] = 'd'; $arrayCount = count($a); echo "FOR: \n"; for ($key = 0; $key < $arrayCount; $key++) echo 'key: ' . $key . ', value: ' . $a[$key] . "\n\n"; echo "FOREACH: \n"; foreach ($a as $key => $value) echo 'key: ' . $key . ', value: ' . $value . "\n";
Wykonanie go daje taki wynik:
FOR: key: 0, value: c key: 1, value: b key: 2, value: d key: 3, value: a FOREACH: key: 3, value: a key: 1, value: b key: 0, value: c key: 2, value: d
Wpis ukazuje brak wiedzy autora.
OdpowiedzUsuńPętla for() nie iteruje po elementach tablicy! Przechodzi ona przez kolejne elementy zadanej sekwencji (w tym przypadku od 0 do n). To, że wewnątrz pętli dobierasz się do elementów tablicy pod konkretnym identyfikatorem to już inna sprawa.
Druga sprawa to fakt, że pętla for() wcale nie musi ustawiać wartości rosnąco lub malejąco. Przykład:
for ($i=1; $i<10; $i = ($i + ($i > 0 ? 1 : -1)) * -1) {
echo $i."\n";
}
Pozdrawiam :)
Mój błąd, dzięki za dobitne wyprostowanie:) Wpis został zmieniony tak, że nie zawiera już rażącego błędu:)
OdpowiedzUsuńimo powinieneś również wspomnieć o kwestii wydajności obu tych rozwiązań, różnica jest spora...
OdpowiedzUsuń$key < count($a)
OdpowiedzUsuńałć.... ale wiesz, że count($a) będzie wykonywany za każdym obrotem pętli? To co napisałeś podają jako przykłady nieoptymalnego kodu a Ty tym uraczasz początkujących ;)
Liczbę elementów tablicy należy wyliczyć przed pętlą i wpętli operować już na tej wyliczonej wartości
@nospor
OdpowiedzUsuńOczywiście poprawka naniesiona. Co za wstyd:P