Незаконне зміщення рядка Попередження PHP


193

Я отримую дивну помилку 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 тут правильна відповідь.
vjei

19
Увага, хто переглядає це питання: правильна відповідь на це запитання не одна, позначена; Правильно наведено нижче Kzqai
Аарон

Відповіді:


37

Будь ласка, спробуйте так ... Я перевірив цей код .... Він працює ....

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

1
Знайшов це. Спасибі за вашу допомогу. var_dump допоміг. Я завантажив масив з конфігураційного файлу, який мав такий вміст strage. масив (2) {["хост"] => рядок (9) "127.0.0.1" ["порт"] => рядок (5) "11211"} рядок (5) "m_prefix" PHP 5.4 зараз $ xx [' хост '] кинув попередження правильно.
thesonix

У мене була така ж помилка після include_once($file);. Масив був побудований правильно (інформація про налагодження показує це), однак його потрібно було скопіювати вручну в інший масив, перш ніж його можна було використовувати без попереднього попередження повідомлення про попереднє відключення PHP.
Франц Холзінгер

$ sStartDate = date ("Ymd", strtotime ($ feed ['DTSTART'] ['value'])); $ sEndDate = date ("Ymd", strtotime ($ feed ['DTEND'] ['value'])); Як тут виправити ту саму помилку Попередження: Незаконне зміщення рядка
Дж. Шабу

303

Помилка, 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
Натрапив на цю проблему через певний час. Спасибі
Девід Оквій

Іноді ця помилка може виникнути при спробі схопити неправильний вузол багатовимірного масиву, тобто переходити "занадто глибоко", вам потрібен батько вибору
zoltar

Це правильно, я використовував 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'як зміщення для рядка. Подобається це:

$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 = (масив) $ 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

Як це стосується масивів ...?
не описує опис,


1

У моєму випадку я міняю mysql_fetch_assoc на mysql_fetch_array та вирішую. На вирішення потрібні 3 дні :-( та інші версії мого proyect запускаються з добором.


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.