非法string偏移警告PHP

更新我的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并重新设置错误级别。

感谢您的帮助!

请尝试这种方式….我已经testing了这个代码….它的工作….

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

错误Illegal string offset 'whatever' in...通常意味着:你正在尝试使用一个string作为一个完整的数组。

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

 $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

对于那些想要把这个错误的模糊性转化成这个问题的人来说,就像我一样。

TL; DR

你试图访问一个string ,就好像它是一个数组一样,一个键是一个stringstring不会理解的。 在代码中,我们可以看到问题:

 "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. 

深入

我们来看看这个错误:

警告:非法string偏移“端口”在…

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

 $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 ... 

这是什么原因?

出于某种原因,你期望一个array ,但你有一个string 。 只是一个混乱。 也许你的variables被改变了,也许它从来不是一个array ,这实际上并不重要。

可以做什么?

如果我们知道我们应该有一个array ,我们应该做一些基本的debugging,以确定为什么我们没有一个array 。 如果我们不知道是否有arraystring ,事情会变得有点棘手。

我们可以做的是各种检查,以确保我们没有通知,警告或错误,如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']值为null ,则isset返回falsearray_key_exists只会检查密钥是否存在

这里有很多很好的答案,但是我发现我的问题比较简单。

我试图运行以下命令:

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

而我在$x['name']上得到了这个illegal string错误,因为我没有先定义数组。 所以我把下面这行代码放入$x[]

 $x = array(); 

它的工作。

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

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

当调用这个函数时,如果提供一个string值,像这样:

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

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

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

在检查数组之前,请执行以下操作:

 if(!is_array($memcachedConfig)) $memcachedConfig = array(); 

在我的情况下,我将mysql_fetch_assoc更改为mysql_fetch_array并解决。 这需要3天的时间来解决: – (和我的proyect其他版本运行fetch assoc。

只是为了扩大这一点。 同样的错误,不同的问题。

我只是检查一个不存在的值,因为我在一个更大的数组中混合了单维和multidimensional array。 所以,当我检查$ array ['key']时,它会在没有关联['key']的项目上抛出一个'Illegal String'错误。 仅供参考。

只要incase它可以帮助任何人,我得到这个错误,因为我忘记了反序列化一个序列化的数组。 这绝对是我会检查,如果它适用于你的情况。

这是一个旧的,但如果有人可以从中受益。 如果你的数组是空的,你也会得到这个错误。

在我的情况下,我有:

 $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'; } 

在我的情况下,我解决了它,当我改变了函数, SQL查询之后: return json_encode($array)然后: return $array