Как пропустить 1-й ключ в цикле массива? - PullRequest
47 голосов
/ 16 декабря 2008

У меня есть следующий код:

if ($_POST['submit'] == "Next") {
    foreach($_POST['info'] as $key => $value) {
        echo $value;
    }
}

Как заставить функцию foreach запускаться со второго ключа в массиве?

Ответы [ 12 ]

109 голосов
/ 16 декабря 2008

Для достаточно маленьких массивов используйте array_slice , чтобы создать второй:

foreach(array_slice($_POST['info'],1) as $key=>$value)
{
    echo $value;
}
41 голосов
/ 16 декабря 2008
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;
}
23 голосов
/ 30 марта 2011

Не могли бы вы просто сбросить массив ...

Так что, если бы у меня был массив, где я не хотел первый экземпляр, Я мог бы просто:

unset($array[0]);

и это удалит экземпляр из массива.

6 голосов
/ 16 декабря 2008

Если бы вы работали с обычным массивом, я бы сказал, что использовать что-то вроде

foreach (array_slice($ome_array, 1) as $k => $v {...

но, поскольку вы просматриваете запрос пользователя, у вас нет реальных гарантий порядка, в котором могут быть возвращены аргументы - какой-то браузер / прокси-сервер может изменить свое поведение или вы можете просто решить изменить Форма в будущем. В любом случае, в ваших интересах игнорировать упорядочение массива и рассматривать значения POST как неупорядоченную хэш-карту, оставляя вам две опции:

  • скопируйте массив и unset ключ, который вы хотите игнорировать
  • перебирает весь массив и continue, когда видит ключ, который вы хотите игнорировать
4 голосов
/ 16 декабря 2008

в цикле:

if ($key == 0) //or whatever
   continue;
3 голосов
/ 16 декабря 2012

Альтернативный способ - использовать указатели массива:

reset($_POST['info']); //set pointer to zero
while ($value=next($_POST['info'])  //ponter+1, return value
{
  echo key($_POST['info']).":".$value."\n";
}
2 голосов
/ 18 декабря 2008

Если вы хотите выбросить первый элемент, вы можете использовать array_shift(). Тем не менее, это медленно на огромном массиве. Более быстрая операция будет

reset($a);
unset(key($a));
1 голос
/ 22 января 2016

Рабочий код с моего сайта для пропуска первого результата, а затем продолжения.

<?php 

$counter = 0;

foreach ($categoriest as $category) { if ($counter++ == 0) continue; ?>

Он работает на opencart и в файле tpl, если вам это нужно, сделайте это.

1 голос
/ 18 декабря 2008

Для массива, заполненного 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)

float (0.24102783203125)

0 голосов
/ 20 мая 2010

Как насчет этого? Считайте первый ключ и значение, используя key() и current(), затем array_shift(), чтобы удалить из очереди передний элемент из массива (РЕДАКТИРОВАТЬ: не использовать array_shift(), он нумерует любые числовые индексы в массиве, который вы не всегда хотите!).

    <?php

    $arr = array(

      'one' => "ONE!!",
      'two' => "TWO!!",
      'three' => "TREE",
      4 => "Fourth element",
      99 => "We skipped a few here.."

    ) ;

    $firstKey = key( $arr ) ;
    $firstVal = current( $arr ) ;

    echo( "<p>OK, first values are $firstKey, $firstVal</p>" ) ;
    ####<del>array_shift( $arr ) ; #'dequeue' front element</del> # BAD! renumbers!
    unset( $arr[ $firstKey ] ) ;  # BETTER!

    echo( "<p>Now for the rest of them</p>" ) ;
    foreach( $arr as $key=>$val )
    {
      echo( "<p>$key => $val</p>" ) ;
    }

    ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...