Ответ 1
Пожалуйста, попробуйте этот путь.... Я проверил этот код.... Он работает....
$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r ($memcachedConfig['host']);
Я получаю странную ошибку 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
Для тех, кто приходит к этому вопросу, пытается перевести неопределенность ошибки во что-то сделать, как и я.
Вы пытаетесь получить доступ к 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();
и он работал.
Немного опоздал на вопрос, но для тех, кто ищет: я получил эту ошибку, инициализировав с неправильным значением (тип):
$varName = '';
$varName["x"] = "test"; // causes: Illegal string offset
Правильный путь:
$varName = array();
$varName["x"] = "test"; // works
Как и в случае с 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.
просто используйте
$memcachedConfig = array();
до
print $memcachedConfig['host'];
print $memcachedConfig['port'];
Warning: Illegal string offset 'host' in ....
Warning: Illegal string offset 'port' in ....
это потому, что вы никогда не определяете, что такое $ memcachedConfig, поэтому по умолчанию обрабатываются строкой, а не массивами.
Просто помогите кому-нибудь, я получаю эту ошибку, потому что забыл о неэтериализованном сериализованном массиве. Это определенно то, что я хотел бы проверить, применимо ли это к вашему делу.
Это старый, но в случае, если кто-то может воспользоваться этим. Вы также получите эту ошибку, если ваш массив пуст.
В моем случае у меня было:
$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
Это работает для меня:
Тестовый код моего:
$var2['data'] = array ('a'=>'21','b'=>'32','c'=>'55','d'=>'66','e'=>'77');
foreach($var2 as $result)
{
$test = $result['c'];
}
print_r($test);
Выход: 55
Проверьте это, ребята. Спасибо
Я решил эту проблему с помощью функции trim(). проблема была с космосом.
так давайте попробуем
$unit_size = []; //please declare the variable type
$unit_size = exolode("x", $unit_size);
$width = trim ($unit_size[1] );
$height = trim ($unit_size[2] );
Я надеюсь, что это поможет вам.
print_r (get_plugin_data ($ строка [0] [ 'Описание']));
я получаю сообщение об ошибке в этой строке Недопустимое смещение строки 'Описание
я думаю, что единственная причина для этого сообщения в том, что целевой массив на самом деле массив, как строка и т.д. (JSON → {"host": "127.0.0.1"}) переменная
Для 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, так что узнайте, как проверить, является ли массив пустым на других языках.