不能在php中使用字符串偏移量作为数组

时间:2009-12-09 13:41:09

标签: php

我正在尝试使用示例php代码模拟此错误,但尚未成功。任何帮助都会很棒。

“不能将字符串偏移用作数组”

10 个答案:

答案 0 :(得分:58)

对于PHP4

...这再现了错误:

$foo    = 'bar';
$foo[0] = 'bar';

对于PHP5

...这再现了错误:

$foo = 'bar';

if (is_array($foo['bar']))
    echo 'bar-array';
if (is_array($foo['bar']['foo']))
    echo 'bar-foo-array';
if (is_array($foo['bar']['foo']['bar']))
    echo 'bar-foo-bar-array';

(实际上来自bugs.php.net

编辑,

  

那么为什么错误不会出现在   首先是条件,即使它是一个   字符串。

因为PHP是一种非常宽容的编程语言,我猜。我将用代码说明我的想法:

$foo = 'bar';
// $foo is now equal to "bar"

$foo['bar'] = 'foo';
// $foo['bar'] doesn't exists - use first index instead (0)
// $foo['bar'] is equal to using $foo[0]
// $foo['bar'] points to a character so the string "foo" won't fit
// $foo['bar'] will instead be set to the first index
// of the string/array "foo", i.e 'f'

echo $foo['bar'];
// output will be "f"

echo $foo;
// output will be "far"

echo $foo['bar']['bar'];
// $foo['bar'][0] is equal calling to $foo['bar']['bar']
// $foo['bar'] points to a character
// characters can not be represented as an array,
// so we cannot reach anything at position 0 of a character
// --> fatal error

答案 1 :(得分:8)

一旦我升级到PHP 7,我就能够重现这一点。当你尝试将数组元素强制转换为字符串时,它会中断。

$params = '';
foreach ($foo) {
  $index = 0;
  $params[$index]['keyName'] = $name . '.' . $fileExt;
}

更改后:

$params = '';

为:

$params = array();

我没有收到错误。我在bug report thread中找到了解决方案。我希望这会有所帮助。

答案 2 :(得分:4)

我正在解决类似的问题,所以在这里记录以防万一。

__get()方法中,我使用给定的参数作为属性,如(简化示例)中所示:

function __get($prop) {
     return $this->$prop;
}

...即。 $obj->fred将访问该类的private / protected fred属性。

我发现当我需要在此属性中引用数组结构时,它生成了不能将String偏移量用作数组错误。这就是我做错了以及如何纠正它:

function __get($prop) {
     // this is wrong, generates the error
     return $this->$prop['some key'][0];
}

function __get($prop) {
     // this is correct
     $ref = & $this->$prop;
     return $ref['some key'][0];
}

说明:在错误的示例中,php将['some key']解释为$prop(一个字符串)的键,而我们需要它来取消引用$ prop。在Perl中,您可以通过使用{}指定来完成此操作,但我不认为这在PHP中是可行的。

答案 3 :(得分:1)

我只想解释我对同一问题的解决方法。

之前的代码(给出相同的错误):

$arr2= ""; // this is the problem and solve by replace this $arr2 = array();
for($i=2;$i<count($arrdata);$i++){
    $rowx = explode(" ",$arrdata[$i]);
    $arr1= ""; // and this is too
    for($x=0;$x<count($rowx);$x++){
        if($rowx[$x]!=""){
            $arr1[] = $rowx[$x];
        }
    }
    $arr2[] = $arr1;
}
for($i=0;$i<count($arr2);$i++){
    $td .="<tr>";
    for($j=0;$j<count($hcol)-1;$j++){
        $td .= "<td style='border-right:0px solid #000'>".$arr2[$i][$j]."</td>"; //and it's($arr2[$i][$j]) give an error: Cannot use string offset as an array
    }
    $td .="</tr>";
}

我的代码之后并解决了它:

$arr2= array(); //change this from $arr2="";
for($i=2;$i<count($arrdata);$i++){
    $rowx = explode(" ",$arrdata[$i]);
    $arr1=array(); //and this
    for($x=0;$x<count($rowx);$x++){
        if($rowx[$x]!=""){
            $arr1[] = $rowx[$x];
        }
    }
    $arr2[] = $arr1;
}
for($i=0;$i<count($arr2);$i++){
    $td .="<tr>";
    for($j=0;$j<count($hcol)-1;$j++){
        $td .= "<td style='border-right:0px solid #000'>".$arr2[$i][$j]."</td>";
    }
    $td .="</tr>";
}

感谢的。 希望它有所帮助,如果我的英语混乱像男孩的房间那样对不起:D

答案 4 :(得分:1)

当您直接打印print_r(($value['<YOUR_ARRAY>']-><YOUR_OBJECT>));时,它会显示此致命错误Cannot use string offset as an object in。 如果你这样打印

$var = $value['#node']-><YOU_OBJECT>; print_r($var);

你不会得到错误!!

答案 5 :(得分:1)

我遇到了这个错误而且很疯狂

我的代码是

$aux_users='';

foreach ($usuarios['a'] as $iterador) { 
#code
if ( is_numeric($consultores[0]->ganancia) ) {
    $aux_users[$iterador]['ganancia']=round($consultores[0]->ganancia,2);
  }
}
$aux_users='';更改为$aux_users=array();

它发生在我的PHP 7.2(在生产服务器!)但是正在开发php 5.6和php 7.0.30所以要注意!感谢Young Michael,我希望它对你有所帮助!

答案 6 :(得分:1)

在尝试调试一些旧的旧代码(我现在在PHP 7.30上运行)时,我第一次遇到此错误。简化的代码如下所示:

$testOK = true;

if ($testOK) {
    $x['error'][] = 0;
    $x['size'][] = 10;
    $x['type'][] = 'file';
    $x['tmp_name'][] = 'path/to/file/';
}

最简单的解决方法是在$ x之前声明为array():

$x = array();

if ($testOK) {
    // same code
}

答案 7 :(得分:0)

我相信你问的是PHP中的变量插值。

让我们做一个简单的工具:

$obj = (object) array('foo' => array('bar'), 'property' => 'value');
$var = 'foo';

现在我们有一个对象,其中:

print_r($obj);

会给出输出:

stdClass Object
    (
        [foo] => Array
            (
                [0] => bar
            )

        [property] => value
    )

我们的变量$var包含字符串&#34; foo&#34;。

如果您尝试使用:

$give_me_foo = $obj->$var[0];

而不是:

$give_me_foo = $obj->foo[0];

你得到&#34;不能将字符串偏移用作数组[...]&#34;结果出现错误消息,因为您尝试执行的操作实际上是将消息$var[0]发送到对象$obj。而且 - 正如您从夹具中看到的那样 - 没有定义$var[0]的内容。变量$var 是字符串不是数组

在这种情况下你可以做的是使用花括号,这将确保首先调用$var的内容,然后发送消息的其余内容:

$give_me_foo = $obj->{$var}[0];

结果是"bar",正如您所料。

答案 8 :(得分:0)

自PHP 7.1+发行以来,无法为数组分配如下值:

$foo = ""; 
$foo['key'] = $foo2; 

因为自PHP 7.1.0起,在字符串上应用空索引运算符会引发致命错误。以前,该字符串被静默转换为数组。

答案 9 :(得分:-1)

错误发生在:

$a = array(); 
$a['text1'] = array();
$a['text1']['text2'] = 'sometext';

然后

echo $a['text1']['text2'];     //Error!!

<强>解决方案

$b = $a['text1'];
echo $b['text2'];    // prints: sometext

...