非法字符串偏移量警告 PHP

Illegal string offset Warning PHP

提问人:thesonix 提问时间:3/26/2012 最后编辑:Bharatathesonix 更新时间:7/27/2023 访问量:1002885

问:

将我的 php 版本更新到 5.4.0-3 后,我收到一个奇怪的 PHP 错误。

我有这个数组:

Array
(
    [host] => 127.0.0.1
    [port] => 11211
)

当我尝试像这样访问它时,我收到奇怪的警告

 print $memcachedConfig['host'];
 print $memcachedConfig['port'];


 Warning: Illegal string offset 'host' in ....
 Warning: Illegal string offset 'port' in ...

我真的不想只是编辑我的php.ini并重新设置错误级别。

PHP 警告

评论

22赞 zerkms 3/26/2012
显然不是那个数组。显示$memcachedConfigvar_dump($memcachedConfig);
1赞 Skrol29 3/26/2012
这意味着密钥不存在。在“打印”之前检查您的变量。var_export($memcachedConfig)
12赞 grantwparks 7/19/2014
大多数人忽略的是,这并不意味着索引不存在 - 这会产生“未定义索引”消息。这是一个不同的错误。
8赞 wedi 6/20/2015
stackoverflow.com/a/20271518/2898712 是这里的正确答案。
26赞 Aaron 1/30/2016
任何查看此问题的人请注意:此问题的正确答案不是标记的答案;正确的是 Kzqai 的下面

答:

37赞 letsnurture 3/26/2012 #1

请尝试这种方式....我已经测试了这个代码......它有效......

$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r($memcachedConfig['host']);

评论

1赞 thesonix 3/26/2012
找到了。感谢您的帮助。var_dump帮了忙。我从配置文件加载了数组,该文件的 strage 内容如下所示。array(2) { [“host”]=> string(9) “127.0.0.1” [“port”]=> string(5) “11211” } string(5) “m_prefix” PHP 5.4 现在 $xx['host'] 正确地抛出了警告。
0赞 Franz Holzinger 2/6/2016
我在 .该数组已正确构建(调试信息显示了这一点),但是必须手动将其复制到另一个数组中,然后才能在没有 PHP 非法字符串偏移警告消息的情况下使用。include_once($file);
0赞 J. Shabu 6/15/2017
$sStartDate = date(“Y-m-d”,strtotime($feed['DTSTART']['value']));$sEndDate = date(“Y-m-d”, strtotime($feed['DTEND']['value']));如何在此处修复相同的错误警告:非法字符串偏移量
7赞 egst 8/10/2020
如何解释为什么这有效,为什么 OP 的代码无效?像这样的答案是人们对 Stack Overflow 持怀疑态度的主要原因,尽管有很多人愿意解释他们答案中的每一个细节,并实际上创建一些有用且具有教育意义的内容。
0赞 Enkracken 7/14/2023
试着理解这个问题,@egst。它是配置文件问题中的关联数组。我真的很抱歉。我不想这么粗鲁,但是我,英语能力很差,需要 3 年以上的时间才能弄清楚 OOP 中的类和对象是什么,可以得到这个问题。Stackoverflow(另一篇文章)中有很多很长的解释,我不明白他们的答案
389赞 Kzqai 11/29/2013 #2

该错误通常意味着:您正在尝试将字符串用作完整数组。Illegal string offset 'whatever' in...

这实际上是可能的,因为在 php 中可以将字符串视为单个字符的数组。所以你认为$var是一个带有键的数组,但它只是一个带有标准数字键的字符串,例如:

$fruit_counts = array('apples'=>2, 'oranges'=>5, 'pears'=>0);
echo $fruit_counts['oranges']; // echoes 5
$fruit_counts = "an unexpected string assignment";
echo $fruit_counts['oranges']; // causes illegal string offset error

您可以在此处看到其实际效果: http://ideone.com/fMhmkR

对于那些来到这个问题的人,试图将错误的模糊性转化为可以解决它的事情,就像我一样。

评论

11赞 grantwparks 7/19/2014
我敢打赌,可以证明这是最初问题发生的原因。大多数注释错误地认为“未定义的索引”是错误的。
3赞 zoltar 3/28/2018
有时,当尝试抓取多维数组的错误节点时,可能会发生此错误,即“太深”,您需要选择的父节点
0赞 MNN 7/26/2018
这是正确的,我使用了并且工作得很好。fetchAll(PDO::FETCH_ASSOC)fetch(PDO::FETCH_ASSOC)
1赞 Avatar 9/26/2019
不小心,我在代码的另一部分使用了两次相同的方法,导致了错误消息。$variablename = [];$variablename = "test";
0赞 Herbert Van-Vliet 7/1/2020
出现此错误时,请向后看定义变量的位置。就我而言,错误是使用 $tables = array_fill_keys( $keys, '' ),后跟 $tables[$key]['name'] = 'something' - 这很草率,因为 $table[$key] 不是数组而是字符串。
4赞 dlopezgonzalez 12/4/2014 #3

在检查阵列之前,请执行以下操作:

if(!is_array($memcachedConfig))
     $memcachedConfig = array();
102赞 Jon Surrell 2/19/2015 #4

您正在尝试访问一个数组,其键是 . 不会明白这一点。在代码中,我们可以看到问题:stringstringstring

"hello"["hello"];
// PHP Warning:  Illegal string offset 'hello' in php shell code on line 1

"hello"[0];
// No errors.

array("hello" => "val")["hello"];
// No errors. This is *probably* what you wanted.

深入了解

让我们看看那个错误:

警告:非法字符串偏移量“端口”...

它说了什么?它说我们正在尝试使用字符串作为字符串的偏移量。喜欢这个:'port'

$a_string = "string";

// This is ok:
echo $a_string[0]; // s
echo $a_string[1]; // t
echo $a_string[2]; // r
// ...

// !! Not good:
echo $a_string['port'];
// !! Warning: Illegal string offset 'port' in ...

是什么原因造成的?

出于某种原因,您期望有一个 ,但您有一个 .只是混淆了。也许你的变量被改变了,也许它从来没有改变过,这真的不重要。arraystringarray

可以做些什么?

如果我们知道我们应该有一个 ,我们应该做一些基本的调试来确定为什么我们没有 .如果我们不知道我们是否会有一个 or ,事情就会变得有点棘手。arrayarrayarraystring

我们能做的是进行各种检查,以确保我们没有通知、警告或错误,例如is_arrayissetarray_key_exists

$a_string = "string";
$an_array = array('port' => 'the_port');

if (is_array($a_string) && isset($a_string['port'])) {
    // No problem, we'll never get here.
    echo $a_string['port'];
}

if (is_array($an_array) && isset($an_array['port'])) {
    // Ok!
    echo $an_array['port']; // the_port
}

if (is_array($an_array) && isset($an_array['unset_key'])) {
    // No problem again, we won't enter.
    echo $an_array['unset_key'];
}


// Similar, but with array_key_exists
if (is_array($an_array) && array_key_exists('port', $an_array)) {
    // Ok!
    echo $an_array['port']; // the_port
}

issetarray_key_exists 之间存在一些细微的差异。例如,如果 的值为 ,则返回 。 只会检查,嗯,密钥是否存在$array['key']nullissetfalsearray_key_exists

1赞 Pichitron 6/6/2015 #5

就我而言,我mysql_fetch_assoc更改为mysql_fetch_array和解决。需要 3 天才能解决:-(而我的 proyect 的其他版本则使用 fetch assoc 运行。

15赞 Brian Powell 3/11/2016 #6

这里有很多很好的答案 - 但我发现我的问题要简单得多。

我正在尝试运行以下命令:

$x['name']   = $j['name'];

我收到这个错误是因为我没有先定义数组。因此,在尝试将内容分配给之前,我将以下代码行放入:illegal string$x['name']$x[]

$x = array();

它奏效了。

评论

1赞 sonnb 1/26/2017
我认为这应该是答案。这必须是 5.4(和之前的 7)和 7 之间的差异。
5赞 Anirudh Sood 5/9/2016 #7

从 PHP 5.4 开始,我们需要传递函数期望的相同数据类型值。例如:

function testimonial($id); // This function expects $id as an integer

调用此函数时,如果提供如下字符串值:

$id = $array['id']; // $id is of string type
testimonial($id); // illegal offset warning

由于数据类型不匹配,这将生成非法偏移警告。为了解决这个问题,你可以使用 settype

$id = settype($array['id'],"integer"); // $id now contains an integer instead of a string
testimonial($id); // now running smoothly

评论

0赞 some-non-descript-user 7/12/2016
这与数组有什么关系...?
0赞 Marc 3/7/2017 #8

以防万一它对任何人都有帮助,我收到此错误是因为我忘记取消序列化数组。这绝对是我要检查的,如果它适用于你的情况。

0赞 edo.b hiortee 3/30/2017 #9

这是一个旧的,但以防有人可以从中受益。 如果您的数组为空,您也会收到此错误。

就我而言,我有:

$buyers_array = array();
$buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array
...
echo $buyers_array['firstname'] . ' ' . $buyers_array['lastname']; 

我改成了:

$buyers_array = array();
$buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array
...
if(is_array($buyers_array)) {
   echo $buyers_array['firstname'] . ' ' . $buyers_array['lastname']; 
} else {
   echo 'Buyers id ' . $this_buyer_id . ' not found';
}
1赞 Kleber Caldas 6/9/2017 #10

就我而言,当我更改执行sql查询的函数时,我解决了它 之后: 然后:return json_encode($array)return $array

11赞 Marco 1/3/2018 #11

这个问题有点晚了,但对于其他正在搜索的人:我通过使用错误的值(类型)初始化而出现此错误:

$varName = '';
$varName["x"] = "test"; // causes: Illegal string offset

正确的方法是:

 $varName = array();
 $varName["x"] = "test"; // works

评论

0赞 markdwhite 9/25/2019
如果 $varName 是从应该是数组但可能是空字符串的值初始化的,则强制该值可以避免这种情况,例如: $varName = (array) $shouldBeArray
1赞 Y. Joy Ch. Singha 10/2/2018 #12

它对我有用:

我的测试代码:

$var2['data'] = array ('a'=>'21','b'=>'32','c'=>'55','d'=>'66','e'=>'77');
foreach($var2 as $result)
{  
    $test = $result['c'];
}
print_r($test);

输出:55

检查一下,伙计们。谢谢

1赞 chayankQ 3/13/2019 #13

只需使用

$memcachedConfig = array();

以前

 print $memcachedConfig['host'];
 print $memcachedConfig['port'];


 Warning: Illegal string offset 'host' in ....
 Warning: Illegal string offset 'port' in ....

这是因为您从未定义过$memcachedConfig的内容,因此默认情况下由字符串而不是数组处理。

1赞 Jailendra Rajawat 5/10/2019 #14

我通过使用 trim() 函数解决了这个问题。问题出在空间上。

所以让我们试试吧

$unit_size = []; //please declare the variable type 
$unit_size = exolode("x", $unit_size);
$width  = trim ($unit_size[1] );
$height = trim ($unit_size[2] );

我希望这对你有所帮助。

1赞 adnan ahmady 9/24/2019 #15

我认为此消息的唯一原因是因为目标数组实际上是一个数组,例如字符串等(JSON -> {“host”: “127.0.0.1”})变量

1赞 Delorme Grant 10/4/2019 #16

对于PHP

//Setup Array like so
$memcachedConfig = array(
  "host" => "127.0.0.1",
  "port" => "11211"
);

//Always a good practice to check if empty

if(isset($memcachedConfig['host']) && isset($memcachedConfig['port'])){

    //Some codes

    print_r ($memcachedConfig['host']);
    print_r ($memcachedConfig['port']);

}

只需确保检查返回的值是否为空即可。 所以这个例子是针对PHP的,所以找出如何检查一个数组在其他语言中是否为空。

1赞 codelone 1/8/2022 #17

就我而言:在获取数据库记录时,请确保使用而不是或result_array();row();row_array();