Недопустимое смещение строки Предупреждение 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 и повторно устанавливать уровень ошибок.

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

4b9b3361

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

$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r ($memcachedConfig['host']);
27
ответ дан 26 марта '12 в 12:00
источник

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

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

168
ответ дан 28 нояб. '13 в 20:06
источник

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

52
ответ дан 19 февр. '15 в 18:21
источник

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

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

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

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

$x = array();

и он работал.

8
ответ дан 11 марта '16 в 0:08
источник

Как и в случае с 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
3
ответ дан 09 мая '16 в 17:21
источник

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

1
ответ дан 05 июня '15 в 21:56
источник

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

if(!is_array($memcachedConfig))
     $memcachedConfig = array();
1
ответ дан 04 дек. '14 в 14:14
источник

В моем случае я решил это, когда я изменил функцию, которая выполняет запрос sql после: return json_encode($array) затем: return $array

0
ответ дан 09 июня '17 в 4:16
источник

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

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

$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';
}
0
ответ дан 29 марта '17 в 23:07
источник

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

0
ответ дан 07 марта '17 в 12:52
источник