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

194

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

thesonix
источник
20
Очевидно, $memcachedConfigэто не тот массив. Шоуvar_dump($memcachedConfig);
zerkms
1
Это означает, что ключи не существуют. Проверьте вашу переменную var_export($memcachedConfig)непосредственно перед «печатью».
Skrol29
9
То, что пропустило большинство людей, это не значит, что индекс не существует - это создает сообщение «неопределенный индекс». Это другая ошибка.
grantwparks
5
stackoverflow.com/a/20271518/2898712 является правильным ответом здесь.
Веди
19
Внимание всем, кто просматривает этот вопрос: Правильный ответ на этот вопрос не помечен; Правильно ниже Кцкай
Аарон

Ответы:

37

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

$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r($memcachedConfig['host']);
letsnurture
источник
1
Нашел это. Спасибо за вашу помощь. помогло var_dump. Я загрузил массив из конфигурационного файла, в котором было такое странное содержимое. array (2) {["host"] => string (9) "127.0.0.1" ["port"] => string (5) "11211"} string (5) "m_prefix" PHP 5.4 теперь $ xx [' host '] правильно выкинул предупреждение.
Thesonix
У меня была такая же ошибка после include_once($file);. Массив был построен правильно (информация об отладке показывает это), однако его пришлось скопировать вручную в другой массив, прежде чем его можно было использовать без предупреждения PHP о недопустимом смещении строки.
Франц Хольцингер,
$ sStartDate = date ("Ymd", strtotime ($ feed ['DTSTART'] ['value'])); $ sEndDate = date ("Ymd", strtotime ($ feed ['DTEND'] ['value'])); Как исправить ту же ошибку здесь Предупреждение: Недопустимое смещение строки
Дж. Шабу
304

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

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

Kzqai
источник
8
Могу поспорить, это может быть доказано, что это было причиной первоначальной проблемы. Большинство комментариев неверно предполагают, что «неопределенный индекс» был ошибкой.
grantwparks
1
Столкнулся с этой проблемой во время цикла. Спасибо
Дэвид Okwii
Иногда эта ошибка может возникать при попытке захватить неправильный узел многомерного массива, т.
Е. Переходя
Это правильно, я использовал fetchAll(PDO::FETCH_ASSOC)вместо этого fetch(PDO::FETCH_ASSOC)и работал отлично.
MNN
Случайно я использовал одно и то же $variablename = [];дважды, в другой части моего кода, с $variablename = "test";которой возникло сообщение об ошибке.
Кай Ноак
77

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

Джон Суррелл
источник
13

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

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

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

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

$x = array();

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

Брайан Пауэлл
источник
1
Я думаю, что это должен быть ответ. Это должно быть разным между 5.4 (и до 7) и 7.
sonnb
7

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

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

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

 $varName = array();
 $varName["x"] = "test"; // works
Marco
источник
Если $ varName инициализируется из значения, которое должно быть массивом, но может быть пустой строкой, приведение значения может избежать этого, например: $ varName = (array) $ shouldBeArray
markdwhite
4

Начиная с 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
Анируд Суд
источник
Какое это имеет отношение к массивам ...?
какой-то не дескриптор пользователя
2

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

if(!is_array($memcachedConfig))
     $memcachedConfig = array();
dlopezgonzalez
источник
1

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

Pichitron
источник
1

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

Клебер Калдас
источник
1

Это работает для меня:

Код тестирования моего:

$var2['data'] = array ('a'=>'21','b'=>'32','c'=>'55','d'=>'66','e'=>'77');
foreach($var2 as $result)
{  
    $test = $result['c'];
}
print_r($test);

Вывод: 55

Проверьте это, ребята. Спасибо

Y. Joy Ch. Сингха
источник
1

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

$memcachedConfig = array();

перед

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


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

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

chayankQ
источник
1

Я решил эту проблему с помощью функции 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

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

Марк
источник
0

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

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

$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';
}
edo.b hiortee
источник
0

я думаю, что единственная причина для этого сообщения в том, что целевой массив на самом деле массив, как строка и т.д. (JSON -> {"host": "127.0.0.1"}) переменная

Аднан Ахмади
источник
0

Для 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']);

}

Просто убедитесь, что возвращаемое значение не пустое. Так что этот пример был для PHP, так что узнайте, как проверить, является ли массив пустым на других языках.

Делорм Грант
источник