У меня есть приложение в Laravel, которое берет кусок данных из dB и отображает его как JSON. Следующая строка кода генерирует ошибку заголовка:
$decodedData['detail']['is_stem'] = isset($detailData->is_stem) ? $detailData->is_stem : 0;
Ошибка: Невозможно использовать операторы назначения со смещениями строк
$ decodedData - это массив большего размера, который в конечном итоге возвращается как JSON. Он создан таким образом:
$decodedData = json_decode($detailData->detail, true);
$ detailData - это объект, который выглядит так:
App\CareersDetails Object
(
[connection:protected] => mysql
[table:protected] =>
[primaryKey:protected] => id
[keyType:protected] => int
[incrementing] => 1
[with:protected] => Array
(
)
[withCount:protected] => Array
(
)
[perPage:protected] => 15
[exists] => 1
[wasRecentlyCreated] =>
[attributes:protected] => Array
(
[id] => 4
[code] => 1234
[title] => StackOverFlow
[category] => My Category
[detail] => "Some details in JSON"
[is_stem] => 1
[created_at] => 2018-12-28 17:05:15
[updated_at] => 2018-12-28 17:05:15
)
[original:protected] => Array
(
[id] => 7
[code] => 7890
[title] => StackOverFlowRocks
[category] => My Category
[detail] => "Some details in JSON format"
[is_stem] => 1
[created_at] => 2018-12-28 17:05:15
[updated_at] => 2018-12-28 17:05:15
)
[changes:protected] => Array
(
)
[casts:protected] => Array
(
)
[dates:protected] => Array
(
)
[dateFormat:protected] =>
[appends:protected] => Array
(
)
[dispatchesEvents:protected] => Array
(
)
[observables:protected] => Array
(
)
[relations:protected] => Array
(
)
[touches:protected] => Array
(
)
[timestamps] => 1
[hidden:protected] => Array
(
)
[visible:protected] => Array
(
)
[fillable:protected] => Array
(
)
[guarded:protected] => Array
(
[0] => *
)
)
Когда я отлаживаю, используя:
print_r($detailData->is_stem);
Система выводит 1. Значит, установлено.
Альтернативно, мой массив $ decodedData виноват?
Обновлять
Благодаря комментариям я заметил, что мои $ decodedData - это не массив, это строка.
Поэтому я бросил
`$detailData->detail`
На страницу моего браузера с print_r и запустил ее с помощью простого отдельного PHP-скрипта:
$payload = "JSON FROM $detailData->detail";
$data = json_decode($payload,true);
$data['detail']['is_stem'] = 1;
print_r($data );
Это работает. Следовательно, теперь у меня вопрос: почему дамп строки из print_r работает, а мое приложение на основе Laravel - нет?
Или, другими словами, почему json_decode возвращает строку в приложении Laravel, а массив в приложении PHP с тем же вводом?
Возможный дубликат Неустранимая ошибка: нельзя использовать операторы назначения для перегруженных объектов или строковые смещения.
Спасибо @aynber, я обновил свой вопрос, добавив некоторые дополнения из ваших отзывов.
В вашем последнем редактировании есть некоторые синтаксические ошибки, поэтому вы можете их исправить. Что вы имеете в виду, что приложение Laravel не работает?
Обновил мой вопрос, чтобы исправить синтаксис. Проблема связана с приложением Laravel, но когда я выгружаю содержимое $ detailData-> detail с помощью print_r в свой браузер и запускаю его с помощью простого сценария PHP, он создает массив, как и ожидалось.






Проблема в моем случае заключалась в том, что мои данные JSON были дважды закодированы. Исправление было:
$decodedData = json_decode(json_decode($detailData->detail), true);
Обратите внимание, что это не лучшая практика, и мы полностью контролируем это, поэтому мы изменим это как можно скорее.
$decodedData['detail']- это строка, а не массив, поэтому вы не можете назначить ему подключ.