Как пропустить 1-й ключ в цикле массива?

Примечание: Преобразование в строковое преобразование

Это происходит просто, если вы пытаетесь рассматривать массив как строку:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

Массив не может быть просто echo 'd или конкатенируется с строкой, потому что результат не определен. PHP будет использовать строку «Array» вместо массива и вызвать уведомление, чтобы указать, что это, вероятно, не то, что было предназначено, и что вы должны проверять свой код здесь. Вероятно, вы захотите что-то вроде этого:

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

Или зациклируйте массив:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

Если это уведомление появляется где-то, чего вы не ожидаете, это означает переменную, которую вы мысль - это строка, на самом деле это массив. Это означает, что у вас есть ошибка в коде, которая делает эту переменную массивом вместо ожидаемой строки.

49
задан Cœur 13 December 2017 в 03:22
поделиться

9 ответов

Для довольно небольших массивов используйте array_slice для создания второго:

foreach(array_slice($_POST['info'],1) as $key=>$value)
{
    echo $value;
}
114
ответ дан Michael Stum 7 November 2019 в 11:14
поделиться

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

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

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

  • копируют массив и unset ключ, который Вы хотите проигнорировать
  • цикл через целый массив и continue при наблюдении ключа, который Вы хотите проигнорировать
6
ответ дан Sean McSomething 7 November 2019 в 11:14
поделиться

в цикле:

if ($key == 0) //or whatever
   continue;
4
ответ дан Irmantas 7 November 2019 в 11:14
поделиться

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

reset($a);
unset(key($a));
2
ответ дан staticsan 7 November 2019 в 11:14
поделиться

На массиве, заполненном 1 000 элементов, различие довольно минимально.

Тест:

<?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)

1
ответ дан alexn 7 November 2019 в 11:14
поделиться
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;
}
41
ответ дан Tom Haigh 7 November 2019 в 11:14
поделиться


foreach($_POST['info'] as $key=>$value) {
    if ($key == 0) { //or what ever the first key you're using is
        continue;
    }  else { 
        echo $value;
    }
}

0
ответ дан 7 November 2019 в 11:14
поделиться

если Вы структурируете свою форму по-другому

  <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; 
    }
}

... можно теперь просто циклично выполниться по той конкретной структуре и отдыху доступа обычно

0
ответ дан 7 November 2019 в 11:14
поделиться

Как насчет чего-то вроде этого? Считайте первый ключ и значение с помощью 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( "

OK, first values are $firstKey, $firstVal

" ) ; ####array_shift( $arr ) ; #'dequeue' front element # BAD! renumbers! unset( $arr[ $firstKey ] ) ; # BETTER! echo( "

Now for the rest of them

" ) ; foreach( $arr as $key=>$val ) { echo( "

$key => $val

" ) ; } ?>
0
ответ дан 7 November 2019 в 11:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: