Недопустимое смещение строки Предупреждение PHP - PullRequest
168 голосов
/ 26 марта 2012

Я получаю странную ошибку PHP после обновления моей версии php до 5.4.0-3.

У меня есть этот массив:

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 и заново устанавливать уровень ошибок.

Ответы [ 14 ]

259 голосов
/ 28 ноября 2013

Ошибка 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

Для тех, кто придет к этому вопросу, пытаясь перевести неясность ошибки в то, что с этим нужно делать, как я.

66 голосов
/ 19 февраля 2015

TL; DR

Вы пытаетесь получить доступ к string как к массиву с ключом string. string не поймет этого. В коде мы видим проблему:

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

Что это говорит? Он говорит, что мы пытаемся использовать строку '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 ...

Что вызывает это?

По какой-то причине вы ожидали array, но у вас есть string. Просто путаница. Возможно, ваша переменная была изменена, возможно, она никогда не была array, это действительно не важно.

Что можно сделать?

Если мы знаем , у нас должен быть array, мы должны выполнить некоторую базовую отладку, чтобы определить, почему у нас нет array. Если мы не знаем, будет ли у нас array или string, все станет немного сложнее.

То, что мы можем сделать, это все виды проверок, чтобы убедиться, что у нас нет уведомлений, предупреждений или ошибок с такими вещами, как is_array и isset или 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
}

Между isset и array_key_exists имеются некоторые тонкие различия. Например, если значение $array['key'] равно null, isset возвращает false. array_key_exists просто проверит, что ключ существует .

35 голосов
/ 26 марта 2012

Пожалуйста, попробуйте этот способ .... Я проверил этот код .... Он работает ....

$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r ($memcachedConfig['host']);
11 голосов
/ 11 марта 2016

Здесь есть много отличных ответов, но я обнаружил, что моя проблема была немного проще.

Я пытался запустить следующую команду:

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

и я получал эту illegal string ошибку на $x['name'], потому что сначала я не определил массив. Поэтому я вставил следующую строку кода, прежде чем пытаться присвоить вещи $x[]:

$x = array();

и это сработало.

4 голосов
/ 03 января 2018

Немного опоздал на вопрос, но для других, кто ищет: я получил эту ошибку, инициализировав с неправильным значением (типом):

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

Правильный путь:

 $varName = array();
 $varName["x"] = "test"; // works
4 голосов
/ 09 мая 2016

Начиная с 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
1 голос
/ 05 июня 2015

В моем случае я изменяю mysql_fetch_assoc на mysql_fetch_array и решаю.Требуется 3 дня, чтобы решить :-( и другие версии моего проекта работают с fetch assoc.

1 голос
/ 04 декабря 2014

Прежде чем проверять массив, сделайте следующее:

if(!is_array($memcachedConfig))
     $memcachedConfig = array();
0 голосов
/ 10 мая 2019

Я решил эту проблему с помощью функции trim (). проблема была с пробелом.

так что давайте попробуем

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

Надеюсь, это поможет вам.

0 голосов
/ 13 марта 2019

просто используйте

$memcachedConfig = array();

до

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


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

это потому, что вы никогда не определяете, что такое $ memcachedConfig, поэтому по умолчанию обрабатываются строкой, а не массивами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...