如何修复错误:不能将字符串偏移量用作数组
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" => "", "template" => "intro");
和 $ret["content"] = $this->getPost($_GET["id"]);
和 $ret["content"] = "Nothing here";
都这样做。如果你以后想创建$ret["content"]
,那么你可能需要先通过$ret["content"] = array();
来初始化它。
【参考方案1】:
代码的许多部分都在对变量进行类型交换;混合arrays
和strings
。试试下面的:
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 字符偏移量