使用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" }
在$ param上使用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 [&#39; x&#39;],并返回非法字符串偏移量错误。我不确定为什么会这样,因为当我手动制作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循环来迭代它?
答案 0 :(得分:1)
修改强> 基于新信息,您所说的部分问题是您将数据存储为一维数组,而事实上您应该将数据存储为二维数组。
考虑到这一点,您的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
最后,为了简化从Eloquent模型中保存和检索JSON
值,您可能需要考虑使用强制转换。
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();
答案 1 :(得分:0)
问题不在于检索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循环。