Якщо вам потрібно зробити щось для кожного елемента, крім першого чи останнього, і лише якщо в масиві є більше одного елемента, я віддаю перевагу наступному рішенню.
Я знаю, що є багато рішень вище і розміщені місяці / за рік до мого, але це те, що я вважаю досить елегантним саме по собі. Перевірка кожного циклу - це також булева перевірка на відміну від числової "i = (count-1)" чека, яка може передбачати менші накладні витрати.
Структура циклу може здаватися незручною, але ви можете порівняти її з упорядкуванням теда (початок), tfoot (кінець), tbody (поточний) у тегах HTML таблиці.
$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;
}
Наприклад, в умовах веб-розробки, якщо ви хочете додати межу донизу до кожного елемента, крім останнього у не упорядкованому списку (ul), ви можете замість цього додати межу на верхній частині до кожного елемента, крім першого (CSS: перша дитина, підтримувана IE7 + та Firefox / Webkit, підтримує цю логіку, тоді як: last-child не підтримується IE7).
Ви можете сміливо використовувати першу змінну $ для кожного вкладеного циклу, і все буде добре, оскільки кожен цикл робить $ перший помилковим під час першого процесу першої ітерації (тому перерви / винятки не спричинять проблем) .
$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;
Приклад виводу:
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)