İlk veya son hariç her öğe için bir şeyler yapmanız gerekiyorsa ve yalnızca dizide birden fazla öğe varsa, aşağıdaki çözümü tercih ederim.
Yukarıda birçok çözüm olduğunu biliyorum ve aylar / bir yıl önce yayınladım, ama bu kendi başına oldukça zarif olduğunu düşündüğüm bir şey. Her döngüyü kontrol et, sayısal "i = (sayım-1)" kontrolünün aksine bir boole kontrolüdür, bu da daha az ek yüke izin verebilir.
Döngünün yapısı garip gelebilir, ancak HTML tablosu etiketlerinde thead (başlangıç), tfoot (son), tbody (geçerli) sıralamasıyla karşılaştırabilirsiniz.
$first = true;
foreach($array as $key => $value) {
if ($first) {
$first = false;
// Do what you want to do before the first element
echo "List of key, value pairs:\n";
} else {
// Do what you want to do at the end of every element
// except the last, assuming the list has more than one element
echo "\n";
}
// Do what you want to do for the current element
echo $key . ' => ' . $value;
}
Örneğin, web geliştirme terimleriyle, sırasız bir listede (ul) sonuncusu hariç her öğeye kenarlık eklemek istiyorsanız, bunun yerine ilk öğenin (CSS: IE7 + ve Firefox / Webkit tarafından desteklenen ilk çocuk bu mantığı desteklerken, son çocuk IE7 tarafından desteklenmez).
Her bir iç içe döngü için $ first değişkenini yeniden kullanmakta özgürsünüz ve her döngü ilk yinelemenin ilk işlemi sırasında $ first false yapar (bu nedenle molalar / istisnalar sorunlara neden olmaz) .
$first = true;
foreach($array as $key => $subArray) {
if ($first) {
$string = "List of key => value array pairs:\n";
$first = false;
} else {
echo "\n";
}
$string .= $key . '=>(';
$first = true;
foreach($subArray as $key => $value) {
if ($first) {
$first = false;
} else {
$string .= ', ';
}
$string .= $key . '=>' . $value;
}
$string .= ')';
}
echo $string;
Örnek çıktı:
List of key => value array pairs:
key1=>(v1_key1=>v1_val1, v1_key2=>v1_val2)
key2=>(v2_key1=>v2_val1, v2_key2=>v2_val2, v2_key3=>v2_val3)
key3=>(v3_key1=>v3_val1)