Illegal string offset Warning PHP

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.
Answer
Solution:
The errorIllegal 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.
Answer
Solution:
You're trying to access astring
as if it were an array, with a key that's astring
.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 anarray
, but you have astring
. Just a mix-up. Maybe your variable was changed, maybe it never was anarray
, it's really not important.
What can be done?
If we know we should have anarray
, we should do some basic debugging to determine why we don't have anarray
. If we don't know if we'll have anarray
orstring
, 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 and
or
:
$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 and
. For example, if the value of
$array['key']
isnull
,isset
returnsfalse
.array_key_exists
will just check that, well, the key exists.
Answer
Solution:
Please try this way.... I have tested this code.... It works....
$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r($memcachedConfig['host']);
Answer
Solution:
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 thisillegal 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.
Answer
Solution:
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
Answer
Solution:
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 :
$id = settype($array['id'],"integer"); // $id now contains an integer instead of a string
testimonial($id); // now running smoothly
Answer
Solution:
Before to check the array, do this:
if(!is_array($memcachedConfig))
$memcachedConfig = array();
Answer
Solution:
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.
Answer
Solution:
In my case, I solved it when I changed in function that does sql query
after:return json_encode($array)
then:return $array
Answer
Solution:
It works to me:
Testing Code of mine:
$var2['data'] = array ('a'=>'21','b'=>'32','c'=>'55','d'=>'66','e'=>'77');
foreach($var2 as $result)
{
$test = $result['c'];
}
print_r($test);
Output:55
Check it guys. Thanks
Answer
Solution:
just use
$memcachedConfig = array();
before
print $memcachedConfig['host'];
print $memcachedConfig['port'];
Warning: Illegal string offset 'host' in ....
Warning: Illegal string offset 'port' in ....
this is because you never define what is $memcachedConfig, so by default are treated by string not arrays..
Answer
Solution:
I solved this problem by using trim() function. the issue was with space.
so lets try
$unit_size = []; //please declare the variable type
$unit_size = exolode("x", $unit_size);
$width = trim ($unit_size[1] );
$height = trim ($unit_size[2] );
I hope this will help you.
Answer
Solution:
i think the only reason for this message is because target Array is actually an array like string etc (JSON -> {"host": "127.0.0.1"}) variable
Answer
Solution:
For 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']);
}
Just make sure to check that the value returning is not empty. So this example was for PHP so find out how to check if an array is empty in other languages.
Answer
Solution:
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.
Answer
Solution:
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';
}
Share solution ↓
Additional Information:
Link To Answer People are also looking for solutions of the problem: method illuminate\database\eloquent\collection::paginate does not exist.
Didn't find the answer?
Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.
Similar questions
Find the answer in similar questions on our website.
Write quick answer
Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.