Один вариант уже был (для сравнения его тоже приведу), теперь ещё один:
foreach ($array as $key => $value) {
  if($value == end($array)) {
        // делаем что-либо с последним элементом...
  }
  else {
        // делаем что-либо с каждым элементом
  }
}foreach ($array as $key => $value) {
   if (!next($array)) {
        // делаем что-либо с последним элементом...
   }
   else {
       // делаем что-либо с каждым элементом
   }
}edit1:
Спасибо dkrnl. Устроил тест.
Вариант №1 работает только если явно задать ключи:
$array = array('1' => '1','2' => '2','3' => '3', '4'=>'4','5'=>'5');Вариант №2 работает только если массив передать по ссылке:
$array = new ArrayObject(array(1,2,3,4,5));
Работающий в любом случае вариант:
$total = count($array);
$counter = 0;
foreach($array as $key => value){
  $counter++;
  if($counter == $total){
    // делаем что-либо с последним элементом...
  }
  else{
    // делаем что-либо с каждым элементом
  }
}edit2:
А ведь и правда стало смахивать на for :) Неудобство в том, что при обращении к элементу в случае с for придётся использовать индекс.
edit3:
Неплохое решение DeadLy:
$end_element = array_pop($array);
foreach ($array as $value) {
   // делаем что-либо с каждым элементом
}
   // делаем что-либо с последним элементом $end_element

