不能在php5.2中使用字符串偏移作为数组中断,而不是在php5.4中

时间:2013-09-28 01:55:14

标签: php arrays

我用php遇到了这个问题,我猜最糟糕的是它在我的开发环境(php v5.4)上工作正常但在网络服务器上的测试/实时网站上中断了(php v5.2)。

所以当我var_dump我的$ _POST [" formData"]时,我得到一个如下所示的数组:

array(42) {
    [0] => array(2) {
        ["name"] => string(2) "id";
        ["value"] => string(4) "3972";
    }
    [1] => array(2) {
        ["name"] => string(2) "action";
        ["value"] => string(4) "edit";
    }
...
}

要分开这个,我使用它(或其中的一些变体):

for($i=0;$i<count($_POST["formData"]);$i++) {
    $data[$_POST["formData"][$i]["name"]] = $_POST["formData"][$i]["value"];
}

所以我最终能够通过以下方式访问所有内容:

foreach($data as $key => $value) {
    echo $key . " = " . $value . "<br />";
}

输出:

id = 3972
action = edit
...

所以,再一次,这在我的开发服务器上运行得很好,但在现场网站上中断了。我在这里环顾四周,发现了很多例子,但似乎很多人都在使用不同的例子。

造成这种情况的原因是什么?这是一些设置吗?这是两个版本之间的变化吗?我已经尝试过其他一些东西,但是没有一个能够工作,而且它在测试服务器上进行了一次疼痛测试(一次上传一个文件......是的......)。任何简单的解决方案,还是我必须重建我的脚本?

2 个答案:

答案 0 :(得分:2)

该错误表明您正在使用字符串,就像它是一个数组一样。我假设它是你的for循环。我不完全确定,但$data可能被隐式初始化为一个空字符串,然后您尝试取消引用并分配给它。是否像这样重写呢?

$data = array();    
foreach($_POST['formData'] as $kvp) {
    $data[$kvp['name']] = $kvp['value'];
}

此代码也更快,因为您没有在循环中调用count()

答案 1 :(得分:1)

事实证明这确实是PHP版本之间的差异,如demonstrated by this handy comparison tool

作为参考,从以下两个步骤出现了一些有点令人困惑的错误(在PHP 5.4之前):

  1. 您接受一个您认为是数组的变量,但实际上是一个字符串,并且您访问它的“元素”,例如$foo[1]$foo['bar']。 PHP将此视为“获取字符串的第N个字符” - $foo[1]表示$foo的第二个字符,$foo['bar']表示第一个字符,因为bar被转换到0
  2. 然后,您可以访问那个,就像它是一个数组一样。较新版本的PHP只会在您最终使用的1个字符的字符串上重复步骤1,但在PHP 5.4之前,这会导致丑陋的错误。
  3. 因此在某些情况下,$_POST["formData"]不是数组,而是字符串。这可能有时会在两种环境中发生,但错误处理的不同之处在于在一个环境中屏蔽它而不是在另一个环境中屏蔽它。