2012-03-05 2 views
2
<?php 

$sessionTotal = 10; 

     for($initial = 1; $initial <= $sessionTotal ; $initial++){ 
      echo '<input type="text" name="menuItems" size="20" /><br /><br/>'; 
     } 

    //I have a if statement here checking if the submit button isset, yada yada, after I press the submit button, it returns this error -> Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\yada\yada-yada.php on line 43 

    foreach($_POST['menuItems'] as $value) 
    { 
    echo $value; 
    } 

?> 

После отправки будет отображаться значение $. У меня есть проверка if, если кнопка отправки isset, yada yada, после того, как я нажму кнопку отправки, она вернет эту ошибку -> Предупреждение: неверный аргумент, предоставленный foreach() в C: \ xampp \ htdocs \ yada \ yada-yada .php on line 43Что случилось с этим кодом php foreach?

+0

Ваше сообщение dont habe menuItems entry! опубликовать вывод 'print_r ($ _ POST);' – silly

+0

или $ _POST ['menuItems'] не является массивом. – Gryphius

ответ

3

$_POST['menuItems'] не является массивом, foreach принимает только массивы и определенные объекты.

Если вы сделаете это

<?php 

$sessionTotal = 10; 

     for($initial = 1; $initial <= $sessionTotal ; $initial++){ 
      echo '<input type="text" name="menuItems[]" size="20" /><br /><br/>'; 
     } 

    //I have a if statement here checking if the submit button isset, yada yada, after I press the submit button, it returns this error -> Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\yada\yada-yada.php on line 43 

    if (is_array($_POST['menuItems'])) 
    foreach($_POST['menuItems'] as $value) 
    { 
    echo $value; 
    } 

?> 

Он должен работать.

+0

Прохладный, спасибо, человек. Теперь он работает, почему [] делает массив? * Я отвечу на ваш ответ через 8 минут, это не позволит мне принять до 8 минут * –

+0

-1, чтобы не объяснить, почему именно эти '[]' нужны. С вашим ответом OP может иметь рабочий пример, но до сих пор не получил первой подсказки о том, почему это произошло в первую очередь. – rodneyrehm

+0

@MouseHello, потому что именно так обозначаются массивы: variable [key], если вы не кладете ключ a, он создает новое значение в массиве. –

1

Нет ничего плохого в вашем foreach. Что-то не так с вашим пониманием того, как PHP анализирует атрибуты ввода (_POST, _GET).


<input type="text" name="foobar" value="one"> 
<input type="text" name="foobar" value="two"> 
<input type="text" name="foobar" value="three"> 

переводит к application/x-www-form-urlencoded представления foobar=one&foobar=two&foobar=three.

PHP анализирует эту строку на карте (ассоциативный массив). Он делает это несколько как следующий код:

<?php 
$_GET = array(); 
$string = 'foobar=one&foobar=two&foobar=three'; 
$parts = explode('&', $string); 
foreach ($parts as $part) { 
    $p = explode('=', $part); 
    $_GET[urldecode($p[0])] = urldecode($p[1]); 
} 

Так в основном это назначение $_GET['foobar'] три раза, в результате чего $_GET['foobar'] === 'three'.

Переведенный, это то, что происходит здесь:

$_GET['foobar'] = 'one'; 
$_GET['foobar'] = 'two'; 
$_GET['foobar'] = 'three'; 

В этот момент я хотел бы отметить, что другие языки (Ruby, Java, ...) иметь дело с этим совсем по-другому. Ruby, например, распознает повторяющийся ключ и строит что-то похожее на $_GET['foobar'] = array('one', 'two', 'three').


Существует простой «трюк», чтобы сказать, что PHP повторяющееся значение должно быть разобрано в массив:

<input type="text" name="foobar[]" value="one"> 
<input type="text" name="foobar[]" value="two"> 
<input type="text" name="foobar[]" value="three"> 

приведет к $_GET['foobar'] = array('one', 'two', 'three');

Переведенный, это то, что происходит здесь:

$_GET['foobar'][] = 'one'; 
$_GET['foobar'][] = 'two'; 
$_GET['foobar'][] = 'three'; 

(Примечание: $array[] = 'value' такая же, как array_push($array, 'value'))

Поэтому, когда вы имеете дело с повторением ключевых имен (или <select multiple>) вы хотите для добавления [] к имени, поэтому PHP строит массив из него.

Вы также можете знать, что вы можете указать массив ключей:

<input type="text" name="foobar[hello][world]" value="one"> 

приведет к $_GET['foobar']['hello']['world'] == 'one'.

Смежные вопросы