У меня есть следующий код:
if ($_POST['submit'] == "Next") { foreach($_POST['info'] as $key => $value) { echo $value; } }
Как заставить функцию foreach начинаться со второго ключа в массиве?
Для достаточно малых массивов используйте array_slice для создания второго:
foreach(array_slice($_POST['info'],1) as $key=>$value) { echo $value; }
foreach(array_slice($_POST['info'], 1) as $key=>$value) { echo $value; }
Альтернативно, если вы не хотите копировать массив, который вы могли бы просто сделать:
$isFirst = true; foreach($_POST['info'] as $key=>$value) { if ($isFirst) { $isFirst = false; continue; } echo $value; }
Не могли бы вы просто отключить массив …
Поэтому, если бы у меня был массив, в котором я не хотел бы первого экземпляра, я мог бы просто:
unset($array[0]);
и это приведет к удалению экземпляра из массива.
Если бы вы работали с обычным массивом, я бы сказал, чтобы использовать что-то вроде
foreach (array_slice($ome_array, 1) as $k => $v {...
но, поскольку вы смотрите на запрос пользователя, у вас нет реальных гарантий в том порядке, в котором аргументы могут быть возвращены – некоторые браузеры / прокси могут изменить свое поведение, или вы просто можете изменить свою форму в будущее. В любом случае, в ваших интересах игнорировать порядок массива и рассматривать значения POST как неупорядоченную хэш-карту, оставляя вам два варианта:
unset
ключ, который хотите игнорировать continue
видя ключ, который вы хотите игнорировать в цикле:
if ($key == 0) //or whatever continue;
Альтернативный способ – использовать указатели массива:
reset($_POST['info']); //set pointer to zero while ($value=next($_POST['info']) //ponter+1, return value { echo key($_POST['info']).":".$value."\n"; }
Если вы захотите выбросить первый элемент, вы можете использовать array_shift()
. Однако это происходит медленно на огромном массиве. Более быстрая операция
reset($a); unset(key($a));
На массиве, заполненном 1000 элементами, разница весьма минимальна.
Контрольная работа:
<?php function slice($a) { foreach(array_slice($a, 1) as $key) { } return true; } function skip($a) { $first = false; foreach($a as $key) { if($first) { $first = false; continue; } } return true; } $array = array_fill(0, 1000, 'test'); $t1 = time() + microtime(true); for ($i = 0; $i < 1000; $i++) { slice($array); } var_dump((time() + microtime(true)) - $t1); echo '<hr />'; $t2 = time() + microtime(true); for ($i = 0; $i < 1000; $i++) { skip($array); } var_dump((time() + microtime(true)) - $t2); ?>
Вывод:
Поплавок (+0,23605012893677)
Поплавок (+0,24102783203125)
Рабочий код с моего сайта для пропуски первого результата и затем продолжить.
<?php $counter = 0; foreach ($categoriest as $category) { if ($counter++ == 0) continue; ?>
Он работает с opencart также в tpl-файле, если вам это нужно.
foreach($_POST['info'] as $key=>$value) { if ($key == 0) { //or what ever the first key you're using is continue; } else { echo $value; } }
foreach($_POST['info'] as $key=>$value) { if ($key == 0) { //or what ever the first key you're using is continue; } else { echo $value; } }
если вы структурируете свою форму по-разному
<input type='text' name='quiz[first]' value=""/> <input type='text' name='quiz[second]' value=""/>
… затем в вашем PHP
if( isset($_POST['quiz']) AND is_array($_POST['quiz'])) { //...and we'll skip $_POST['quiz']['first'] foreach($_POST['quiz'] as $key => $val){ if($key == "first") continue; print $val; } }
… теперь вы можете просто перебрать эту конкретную структуру и нормально отдохнуть
Как насчет чего-то подобного? Считайте первый ключ и значение с помощью key()
и current()
, затем (EDIT: Не используйте array_shift()
чтобы удалить из элемента передний элемент из массива array_shift()
, он array_shift()
любые числовые индексы в массиве, которые вы не всегда хотите!).
<? PHP $ arr = массив ( 'one' => "ONE !!", 'two' => "TWO !!", 'three' => "TREE", 4 => «Четвертый элемент», 99 => «Мы пропустили несколько здесь ...» ); $ firstKey = key ($ arr); $ firstVal = current ($ arr); эхо ("ОК, первые значения: $ firstKey, $ firstVal
"); ####array_shift ($ arr); Элемент 'dequeue' переднего элемента# ПЛОХО! перенумеровывает! unset ($ arr [$ firstKey]); # ЛУЧШЕ! эхо ("Теперь для остальных
"); foreach ($ arr как $ key => $ val) { эхо ("$ key => $ val
"); } ?>