可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I get a strange PHP error after updating my php version to 5.4.0-3.
I have this array:
Array ( [host] => 127.0.0.1 [port] => 11211 )
When I try to access it like this I get strange warnings
print $memcachedConfig['host']; print $memcachedConfig['port']; Warning: Illegal string offset 'host' in .... Warning: Illegal string offset 'port' in ...
I really don't want to just edit my php.ini and re-set the error level.
Thanks for any help!
回答1:
Please try this way.... I have tested this code.... It works....
$memcachedConfig = array("host" => "127.0.0.1","port" => "11211"); print_r ($memcachedConfig['host']);
回答2:
The error Illegal string offset 'whatever' in...
generally means: you're trying to use a string as a full array.
That is actually possible since strings are able to be treated as arrays of single characters in php. So you're thinking the $var is an array with a key, but it's just a string with standard numeric keys, for example:
$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
You can see this in action here: http://ideone.com/fMhmkR
For those who come to this question trying to translate the vagueness of the error into something to do about it, as I was.
回答3:
TL;DR
You're trying to access a string
as if it were an array, with a key that's a string
. string
will not understand that. In code we can see the problem:
"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.
In depth
Let's see that error:
Warning: Illegal string offset 'port' in ...
What does it say? It says we're trying to use the string 'port'
as an offset for a string. Like this:
$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 ...
What causes this?
For some reason you expected an array
, but you have a string
. Just a mix-up. Maybe your variable was changed, maybe it never was an array
, it's really not important.
What can be done?
If we know we should have an array
, we should do some basic debugging to determine why we don't have an array
. If we don't know if we'll have an array
or string
, things become a bit trickier.
What we can do is all sorts of checking to ensure we don't have notices, warnings or errors with things like is_array
and isset
or array_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 }
There are some subtle differences between isset
and array_key_exists
. For example, if the value of $array['key']
is null
, isset
returns false
. array_key_exists
will just check that, well, the key exists.
回答4:
There are a lot of great answers here - but I found my issue was quite a bit more simple.
I was trying to run the following command:
$x['name'] = $j['name'];
and I was getting this illegal string
error on $x['name']
because I hadn't defined the array first. So I put the following line of code in before trying to assign things to $x[]
:
$x = array();
and it worked.
回答5:
As from PHP 5.4 we need to pass the same datatype value that a function expects. For example:
function testimonial($id); // This function expects $id as an integer
When invoking this function, if a string value is provided like this:
$id = $array['id']; // $id is of string type testimonial($id); // illegal offset warning
This will generate an illegal offset warning because of datatype mismatch. In order to solve this, you can use settype
:
$id = settype($array['id'],"integer"); // $id now contains an integer instead of a string testimonial($id); // now running smoothly
回答6:
Before to check the array, do this:
if(!is_array($memcachedConfig)) $memcachedConfig = array();
回答7:
In my case i change mysql_fetch_assoc to mysql_fetch_array and solve. It takes 3 days to solve :-( and the other versions of my proyect run with fetch assoc.
回答8:
Just incase it helps anyone, I was getting this error because I forgot to unserialize a serialized array. That's definitely something I would check if it applies to your case.
回答9:
It's an old one but in case someone can benefit from this. You will also get this error if your array is empty.
In my case I had:
$buyers_array = array(); $buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array ... echo $buyers_array['firstname'] . ' ' . $buyers_array['lastname'];
which I changed to:
$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'; }
回答10:
In my case, I solved it when I changed in function that does sql query after: return json_encode($array)
then: return $array
回答11:
A little bit late to the question, but for others who are searching: I got this error by initializing with a wrong value (type):
$varName = ''; $varName["x"] = "test"; // causes: Illegal string offset
The right way is:
$varName = array(); $varName["x"] = "test"; // works