Цикл 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);
}
Думаю комментарии излишни, но если вам что-то непонятно, пишите :-)
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Nikita
08.12.2007
Постоянная ссылка (Permalink)
Первый -- $array[0]
Последний -- $array[count($array)-1]
Зачем это всё? В чём элегантность?
Васек
10.12.2007
Постоянная ссылка (Permalink)
2 Nikita:
Я думаю что первый способ лучше чем два действия предложенные Вами, а вот второй способ можно использовать в своем движке.
Nikita
11.12.2007
Постоянная ссылка (Permalink)
Васек,
почему лучше?
зачем использовать такой способ в своём движке? Что это даёт?
Васек
11.12.2007
Постоянная ссылка (Permalink)
Ну с использованием 1 метода сократится число кода, а второй можно использовать в своем фреймворке например. Как говорится на вкус и цвет товарищей нет ;-) Хотя по хорошему надо сделать тесты на огромном массиве и посмотреть производительность.
Valentin
20.12.2007
Постоянная ссылка (Permalink)
Конструкции типа $array[0] и $array[count($array)-1] хорошо работают когда ключи в массиве числовые и идут по порядку начиная с 0.
Я бы предложил пересмотреть или дополнить функционал подходом подходом типа function &is_first_key(&$array) {} и function &is_last_key(&$array) {}. Которые анализируют позицию указателя в переданном массиве.
Васек
21.12.2007
Постоянная ссылка (Permalink)
Valentin, распишите подробнее пожалуйста Ваше предложение, а то я не очень догнал.
Заранее спасибо!
Vlad.ua
22.11.2008
Постоянная ссылка (Permalink)
В 1-ом варианте использование NEXT() приводит к тому, что указатель переставляется на следующий элемент! Это самый лучший способ вывести данные через один :) Сам пользуюсь следующей конструкцией:
В данном случае речь идет о создания блока запроса MySQL "...WHERE `index` IN (...)" с индексами для выборки.
Марина
18.03.2009
Постоянная ссылка (Permalink)
В последнем примере проще всего воспользоваться функцией implode:
implode(",",$arr);
...WHERE `index` IN ('.implode(",",$arr).')...
gehrmann
24.01.2011
Постоянная ссылка (Permalink)
Ещё в некоторых случаях неплохо смотрится что-то наподобие: