Это происходит просто, если вы пытаетесь рассматривать массив как строку:
$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
}
Если это уведомление появляется где-то, чего вы не ожидаете, это означает переменную, которую вы мысль - это строка, на самом деле это массив. Это означает, что у вас есть ошибка в коде, которая делает эту переменную массивом вместо ожидаемой строки.
Для довольно небольших массивов используйте array_slice для создания второго:
foreach(array_slice($_POST['info'],1) as $key=>$value)
{
echo $value;
}
Если бы Вы работали с нормальным массивом, я сказал бы для использования чего-то как
foreach (array_slice($ome_array, 1) as $k => $v {...
, но, так как Вы смотрите на пользовательский запрос, у Вас нет реальных гарантий на порядке, в котором аргументы могли бы быть возвращены - некоторый браузер/прокси мог бы изменить свое поведение, или Вы могли бы просто решить изменить свою форму в будущем. Так или иначе это находится в Ваших интересах проигнорировать упорядочивание массива и значений POST обработки как незаказанная карта хеша, оставляя Вас с двумя опциями:
unset
ключ, который Вы хотите проигнорировать continue
при наблюдении ключа, который Вы хотите проигнорировать в цикле:
if ($key == 0) //or whatever
continue;
Если Вы готовы выбросить первый элемент, можно использовать array_shift()
. Однако это медленно на огромном массиве. Более быстрая операция была бы
reset($a);
unset(key($a));
На массиве, заполненном 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)
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;
}
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 ()
, затем ( РЕДАКТИРОВАТЬ: не используйте 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
" ) ; } ?>