Se você precisar fazer algo para cada elemento, exceto o primeiro ou o último e somente se houver mais de um elemento na matriz, prefiro a solução a seguir.
Sei que existem muitas soluções acima e postadas meses / um ano antes da minha, mas isso é algo que considero bastante elegante por si só. A verificação de cada loop também é uma verificação booleana, em oposição a uma verificação numérica "i = (contagem-1)", que pode permitir menos sobrecarga.
A estrutura do loop pode parecer estranha, mas você pode compará-la com a ordem de thead (início), tfoot (final), tbody (atual) nas tags da tabela 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;
}
Por exemplo, em termos de desenvolvimento da web, se você deseja adicionar uma borda inferior a todos os elementos, exceto o último de uma lista não ordenada (ul), poderá adicionar uma borda superior a todos os elementos, exceto o primeiro (o CSS: o primeiro filho, suportado pelo IE7 + e Firefox / Webkit, suporta essa lógica, enquanto que: o último filho não é suportado pelo IE7).
Você pode ficar à vontade para reutilizar a variável $ first para cada loop aninhado e tudo funcionará bem, pois cada loop torna o $ first falso durante o primeiro processo da primeira iteração (para que interrupções / exceções não causem problemas) .
$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;
Exemplo de saída:
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)