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


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

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

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


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

Если $ 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();

1

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


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

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


1

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

$memcachedConfig = array();

перед

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


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

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


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';
}

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, так что узнайте, как проверить, является ли массив пустым на других языках.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.