如何修复错误:不能将字符串偏移量用作数组

Posted

技术标签:

【中文标题】如何修复错误:不能将字符串偏移量用作数组【英文标题】:How to fix error: Cannot use string offset as an array 【发布时间】:2018-07-09 12:22:36 【问题描述】:

我在一些旧的 php 网站上工作,不知道如何解决这种错误:

致命错误:未捕获错误:不能将字符串偏移量用作数组

这是抛出错误的部分

$ret["content"]["news"] = array();
$start = ($pagenum - 1) * $page_rows;
$stop = ($count > $start + $page_rows) ? $start + $page_rows : $count;

for($i = $start; $i < $stop; $i++)

    $cnt = sizeof($ret["content"]["news"]);
    print_r($ret);
    $ret["content"]["news"][$cnt] = $this->getPost($all[$i]);           

print_r 返回

数组([内容] => A [模板] => 介绍)

​​>

在这一行抛出错误

$ret["content"]["news"][$cnt] = $this->getPost($all[$i]);   

完整代码来源:https://pastebin.com/aPC2suL5

【问题讨论】:

到底是在哪里扔的? $ret["content"]["news"] 的类型是什么?如果不是数组,则会抛出错误 var_dump($ret["content"]["news"]); $ret["content"] 是一个字符串。通过添加[news],您有什么期望? 如前所述,您的代码将$ret["content"] 设置为各种字符串值。 $ret = array("content" =&gt; "", "template" =&gt; "intro");$ret["content"] = $this-&gt;getPost($_GET["id"]);$ret["content"] = "Nothing here"; 都这样做。如果你以后想创建$ret["content"],那么你可能需要先通过$ret["content"] = array();来初始化它。 【参考方案1】:

代码的许多部分都在对变量进行类型交换;混合arraysstrings。试试下面的:

for($i = $start; $i < $stop; $i++)

   // Debug only. Remove once bugs are squashed. 
   if(!is_array($ret["content"]))
      error_log("You've set ret['content'] as a non-array; probably a string!");
      
    if(!is_array($ret["content"]["news"]))
        error_log("You've set ret['content']['news'] as a non-array too!");
    
    //end debug block
    /***  
     * You do not need to count the array values each time, simply append with []
     ***/
    $ret["content"]["news"][] = $this->getPost($all[$i]);           

【讨论】:

以上是关于如何修复错误:不能将字符串偏移量用作数组的主要内容,如果未能解决你的问题,请参考以下文章

如果数组大小发生变化以及定义的宏如何在此处计算偏移量,为啥 C 结构中的字符数组的偏移量会有所不同? [复制]

重复错误:“不再支持带有花括号的数组和字符串偏移量访问语法”与 phpmyadmin

如何将 utf-8 字节偏移量转换为 utf-8 字符偏移量

当我尝试使用 Laravel 中的“别名”从数据库中获取值时如何修复“未定义的偏移量:0”

java中的偏移量和偏移地址是啥

Kafka - 如何在使用高级消费者的每条消息后提交偏移量?