Цикл foreach определение первого и последнего элемента массива

Я думаю каждый веб программист сталкивался с выводом красивых меню. При решении данной задачи порой необходимо для первого и/или последнего элемента присвоить свои стили. Можно конечно просто посчитать число элементов в массиве и завести счетчик, но я решил раскрыть вам два более элегантных способа решения данной задачи.

Метод номер 1 (наипростейший)

foreach ($array as $key => $value) { // делаем что-либо с каждым элементом if (!next($array)) { // делаем что-либо с последним элементом... } }

Метод номер 2 (универсальный)

$a=getArray(); /* Получаю массив из БД и прогоняю его через шаблон */ if(!empty($a)){ $last_key = & get_last_key($a); $first_key = & get_first_key($a); foreach($a as $k => $v){ // ... Вывод элемента $tpl->assign('CLASS', ($k == $last_key ? ' class="last"' : '')); /* Если элемент последний, то выводим его с классом class="last", аналогично можно сделать и для first_key */ $tpl->parse('MAIN.TOPMENU.ITEM'); } $tpl->parse('MAIN.TOPMENU'); } /* Функция возвращает ключ первого элемента массива */ function &get_first_key(&$array) { if (!is_array($array)) return null; if (!count($array)) return false; // равносильно reset() reset($array); return key($array); } /* Функция возвращает ключ последнего элемента массива */ function &get_last_key(&$array) { if (!is_array($array)) return null; if (!count($array)) return false; // равносильно end() end($array); return key($array); }

Думаю комментарии излишни, но если вам что-то непонятно, пишите :-)

Теги:
Поделись с друзьями:
Комментарии

Первый -- $array[0]
Последний -- $array[count($array)-1]

Зачем это всё? В чём элегантность?

2 Nikita:
Я думаю что первый способ лучше чем два действия предложенные Вами, а вот второй способ можно использовать в своем движке.

Васек,
почему лучше?
зачем использовать такой способ в своём движке? Что это даёт?

Ну с использованием 1 метода сократится число кода, а второй можно использовать в своем фреймворке например. Как говорится на вкус и цвет товарищей нет ;-) Хотя по хорошему надо сделать тесты на огромном массиве и посмотреть производительность.

Конструкции типа $array[0] и $array[count($array)-1] хорошо работают когда ключи в массиве числовые и идут по порядку начиная с 0.
Я бы предложил пересмотреть или дополнить функционал подходом подходом типа function &is_first_key(&$array) {} и function &is_last_key(&$array) {}. Которые анализируют позицию указателя в переданном массиве.

Valentin, распишите подробнее пожалуйста Ваше предложение, а то я не очень догнал.
Заранее спасибо!

В 1-ом варианте использование NEXT() приводит к тому, что указатель переставляется на следующий элемент! Это самый лучший способ вывести данные через один :) Сам пользуюсь следующей конструкцией:

$count = count($arr);
foreach ($arr as $value){
	$count--;
	if ($count == 0) {
		$sep = "";
	} else {
		$sep = ", ";
	}
	$indexes .="'" . $value . "'" . $sep; 
}

В данном случае речь идет о создания блока запроса MySQL "...WHERE `index` IN (...)" с индексами для выборки.

В последнем примере проще всего воспользоваться функцией implode:
implode(",",$arr);
...WHERE `index` IN ('.implode(",",$arr).')...

Ещё в некоторых случаях неплохо смотрится что-то наподобие:

$where = "";
foreach ($ids AS $id) {
     $where += $where? ", ": "";
     $where += someFcn($id);
}