У меня возникают проблемы при использовании цикла foreach для итерации моего массива. Когда я это делаю, кажется, что я удаляю имена элементов и не могу ссылаться на массив, как я ожидал.
Вот JSON, который мы берем из базы данных:
{"i": "", "ca": "", "gh": "5", "kh": "6", "mg": "", "ph": "4", "sg": "", "sr": "", "nh3": "1", "no2": "2", "no3": "3", "po4": "", "tds": "7", "date": "2018-04-05"}
Затем я декодирую его в моем контроллере:
$params = json_decode($aquarium->parameters, true);
Передайте его на просмотр:
return view('pages.aquarium.view', compact('aquarium', 'params', 'stocks', 'settings'));
И используйте его в цикле foreach:
@if(is_array($params))
@foreach($params as $param)
<tr>
<td>{{ $params['date'] }}</td>
<td class="ammonia-col">{{ $param['nh3'] }}</td>
<td class="nitrite-col">{{ $param['no2'] }}</td>
...
</tr>
@endforeach
@endif
Тем не менее, когда я var_dump оригинальные $ params, я получаю это:
array(14) { ["i"]=> string(0) "" ["ca"]=> string(0) "" ["gh"]=> string(1) "5" ["kh"]=> string(1) "6" ["mg"]=> string(0) "" ["ph"]=> string(1) "4" ["sg"]=> string(0) "" ["sr"]=> string(0) "" ["nh3"]=> string(1) "1" ["no2"]=> string(1) "2" ["no3"]=> string(1) "3" ["po4"]=> string(0) "" ["tds"]=> string(1) "7" ["date"]=> string(10) "2018-04-05" }
Использование var_dump в параметре $ дает следующее:
string(0) "" string(0) "" string(1) "5" string(1) "6" string(0) "" string(1) "4" string(0) "" string(0) "" string(1) "1" string(1) "2" string(1) "3" string(0) "" string(1) "7" string(10) "2018-04-05"
Это лишает меня возможности ссылаться на него как $ param [‘x’] и возвращает ошибку недопустимого смещения строки. Я не уверен, почему это так, поскольку это работало, когда я вручную создавал JSON. Теперь, когда я создаю объект и затем использую JSON.stringify, он ломается. Я знаю, что в настоящее время существует только один набор, но в конечном итоге в JSON будет много наборов данных, поэтому цикл foreach потребуется для их итерации.
Для справки, мой старый способ изготовления JSON вручную:
var params = '[{ "date":"'+date+'", "nh3":"'+ammonia+'", "no2":"'+nitrite+'", "no3":"'+nitrate+
'", "ph":"'+ph+'", "gh":"'+gh+'", "kh":"'+kh+'", "tds":"'+tds+'", "sg":"'+sg+'", "po4":"'+
phosphate+'", "ca":"'+calcium+'", "mg":"'+magnesium+'", "i":"'+iodine+'", "sr":"'+strontium+'" }]';
И новый способ:
var params = {
date: date,
nh3: ammonia,
no2: nitrite,
no3: nitrate,
ph: ph,
gh: gh,
kh: kh,
tds: tds,
sg: sg,
po4: phosphate,
ca: calcium,
mg: magnesium,
i: iodine,
sr: strontium
};
В запросе AJAX я затем вызываю JSON.stringify (params), и он надлежащим образом сохраняется как действительный JSON в базе данных.
Глядя на это, я думаю, что я понял проблему. Это сохраняет JSON без квадратных скобок. Я не уверен в правильной терминологии или в том, как добавить ее, не создавая вручную JSON. Хотя я могу вернуться к этому пути, это казалось неправильным, и с этим было трудно работать, если мне нужно было изменить данные.
Как мне соответствующим образом привести JSON в мою базу данных с квадратными скобками, чтобы сформировать коллекцию объектов JSON, чтобы я мог правильно использовать цикл foreach для его итерации?
редактировать
Основываясь на новой информации, часть проблемы, как вы говорите, заключается в том, что вы хранили данные как одномерный массив, тогда как на самом деле вы должны были хранить их как двумерный массив.
Имея это в виду, ваш JSON-декодированный массив будет выглядеть так:
$params = [
[
'i' => '',
'ca' => '',
'gh' => '5',
'kh' => '6',
// ...
],
];
Таким образом, когда вы перебираете свой массив params, вам нужно сделать следующее:
@if (is_array($params))
@foreach ($params as $param)
<tr>
<td>{{ $param['date'] }}</td>
<td class="ammonia-col">{{ $param['nh3'] }}</td>
<td class="nitrite-col">{{ $param['no2'] }}</td>
...
</tr>
@endforeach
@endif
Наконец, чтобы упростить сохранение и извлечение JSON
значения из модели Eloquent, вы можете рассмотреть возможность использования приведения.
https://laravel.com/docs/5.6/eloquent-mutators#array-and-json-casting
class Aquarium extends Model
{
// ...
protected $casts = [
'parameters' => 'array',
];
// ...
}
$aquarium = Aquarium::find(1);
$aquarium->parameters = [
[
// ...
]
];
$aquarium->save();
Проблема была не в поиске JSON, а в том, как я его хранил. Я сохранил это так:
var params = {
date: date,
nh3: ammonia,
no2: nitrite,
no3: nitrate,
ph: ph,
gh: gh,
kh: kh,
tds: tds,
sg: sg,
po4: phosphate,
ca: calcium,
mg: magnesium,
i: iodine,
sr: strontium
};
Когда мне нужно было хранить его как:
var params = [{
date: date,
nh3: ammonia,
no2: nitrite,
no3: nitrate,
ph: ph,
gh: gh,
kh: kh,
tds: tds,
sg: sg,
po4: phosphate,
ca: calcium,
mg: magnesium,
i: iodine,
sr: strontium
}];
Поскольку в одном поле базы данных будет храниться несколько объектов JSON, удаление цикла foreach невозможно.