How to resolve PHP warning Illegal string offset

The PHP warning: Illegal string offset happens when you try to access a string type data as if it’s an array.

In PHP, you can access a character from a string using the bracket symbol as follows:

$myString = "Hello!";

// ๐Ÿ‘‡ access string character like an array
echo $myString[0]; // H
echo $myString[1]; // e
echo $myString[4]; // o

When you try to access $myString above using an index that’s not available, the PHP warning: Illegal string offset occurs.

Here’s an example:

$myString = "Hello!";

// ๐Ÿ‘‡ these cause illegal offset
echo $myString["state"]; // PHP Warning:  Illegal string offset 'state' in..
echo $myString["a"]; // PHP Warning:  Illegal string offset 'a' in ..

To resolve the PHP Illegal string offset warning, you need to make sure that you are accessing an array instead of a string.

To check if you’re actually accessing an array, you can call the is_array() function before accessing the variable as follows:

$myArray = [
    "state" => true,
    "port" => 1331,
];

// ๐Ÿ‘‡ check where myArray is really an array
if (is_array($myArray)) {
    echo $myArray["port"];
    echo $myArray["L"];
}

This warning will also happen when you have a multi-dimensional PHP array where one of the arrays is a string type.

Consider the following example:

$rows = [
    ["name" => "John"],
    "",
    ["name" => "Dave"]
];

foreach ($rows as $row) {
    echo $row["name"]. "\n";
}

The $rows array has a string at index one as highlighted above.

When you loop over the array, PHP will produce the illegal string offset as shown below:

John
PHP Warning:  Illegal string offset 'name' in ...

Dave

To avoid the warning, you can check if the $row type is an array before accessing it inside the foreach function:

foreach ($rows as $row) {
    if(is_array($row)){
        echo $row["name"]. "\n";
    }
}

When the $row is not an array, PHP will skip that row and move to the next one.

The output will be clean as shown below:

John
Dave

When you see this warning in your code, the first step to debug it is to use var_dump() and see the output of the variable:

var_dump($rows);

From the dump result, you can inspect and see if you have an inconsistent data type like in the $rows below:

array(3) {
  [0]=>
  array(1) {
    ["name"]=>
    string(4) "John"
  }
  [1]=>
  string(0) ""
  [2]=>
  array(1) {
    ["name"]=>
    string(4) "Dave"
  }
}

For the $rows variable, the array at index [1] is a string instead of an array.

Writing an if statement and calling the is_array() function will be enough to handle it.

And that’s how you solve the PHP warning: Illegal string offset. Good luck! ๐Ÿ‘

More PHP tutorials

See all