Недопустимое смещение строки Предупреждение PHP

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

Спасибо за любую помощь!

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

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

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

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

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' в качестве смещения для строки. Как это:

 $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 просто проверит это, ну, ключ существует .

Здесь есть много замечательных ответов, но я нашел, что моя проблема была довольно простой.

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

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

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

 $x = array(); 

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

Начиная с 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 

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

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

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

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

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

В моем случае у меня было:

 $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