这个php foreach代码有什么问题?

时间:2012-03-05 09:13:52

标签: php

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

?>

提交后会回显$ value。我有一个if语句检查提交按钮是否设置,yada yada,在我按下提交按钮后,它返回此错误 - &gt;警告:在第43行的C:\ xampp \ htdocs \ yada \ yada-yada.php中为foreach()提供的参数无效

2 个答案:

答案 0 :(得分: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;
    }

?>

它应该有用。

答案 1 :(得分: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'