我正在尝试遍历JSON多维数组,并获得distance每个商店的最低价值,并将其与location_id价值一起打印。
除了这里的一切,我再无其他。我已经尝试通过搜索stackoverflow来尝试一百万个选项,但无法弄清楚我在做什么错。
我的JSON数据是这样的:
$json = '{
"shops": [
{
"shop_id": "100",
"locations": [
{ "location_id": "100_1", "distance": "10.3" },
{ "location_id": "100_2", "distance": "15.2" }
]
},
{
"shop_id": "101",
"locations": [
{ "location_id": "101_1", "distance": "19.3" },
{ "location_id": "101_2", "distance": "12.4" }
]
}]
}';
Run Code Online (Sandbox Code Playgroud)
现在,我拥有的代码是:
// Decode the JSON data
$json_data = json_decode($json,true);
// Do a foreach loop
foreach($json_data['shops'] as $shops){
echo $shops['shop_id'].', ';
// Currently prints:
// 101, 102 ,
// But I need it to print:
// 100_1 -> 10.3, 101_2 -> 12.4
}
Run Code Online (Sandbox Code Playgroud)
我尝试将另一个foreach循环放入现有循环中,但是只打印一个1。
我该如何实现?我不能把头缠住它。我需要distance为每个['shop_id']['locations']
您可以用于array_column提取特定商店的所有距离,然后min在该阵列上使用以获取最低值。为了获得位置,我们然后使用array_search查找具有该值的最小键,并使用该键来获取适合location_id商店的值:
foreach($json_data['shops'] as $shops) {
$distances = array_column($shops['locations'], 'distance');
$locations = array_column($shops['locations'], 'location_id');
$min = min($distances);
$location = array_search($min, $distances);
echo $locations[$location] . ' -> ' . $min . "\n";
}
Run Code Online (Sandbox Code Playgroud)
输出:
100_1 -> 10.3
101_2 -> 12.4
Run Code Online (Sandbox Code Playgroud)
更新资料
正如@Andreas在评论中指出的那样,我们可以使用第三个参数array_column来获取距离数组,并以其location_id作为键。然后,我们可以对数组进行排序并使用current,key以获取最小距离和相应的位置:
foreach($json_data['shops'] as $shops) {
$distances = array_column($shops['locations'], 'distance', 'location_id');
asort($distances);
echo key($distances) . ' -> ' . current($distances) . "\n";
}
Run Code Online (Sandbox Code Playgroud)
输出:
100_1 -> 10.3
101_2 -> 12.4
Run Code Online (Sandbox Code Playgroud)