php - 如何使用 PHP 从 JSON 数组中获取最小值
问题描述
我正在尝试遍历 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" }
]
}]
}';
现在,我的代码是:
// 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
}
我尝试将另一个 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";
}
输出:
100_1 -> 10.3
101_2 -> 12.4
更新
正如@Andreas 在评论中指出的那样,我们可以使用第三个参数来获取以它们为键array_column
的距离数组。location_id
然后我们可以对数组进行排序并使用current
andkey
来获得最小距离和相应的位置:
foreach($json_data['shops'] as $shops) {
$distances = array_column($shops['locations'], 'distance', 'location_id');
asort($distances);
echo key($distances) . ' -> ' . current($distances) . "\n";
}
输出:
100_1 -> 10.3
101_2 -> 12.4
推荐阅读
- php - 对 Laravel 路由的 JQuery POST 请求引发错误,但当我直接访问时工作正常
- django - 如何为整个 Django 应用程序制作全局views.py
- android - Force gradle to use offline version when run emulator for cordova
- r - determine size of the ram in R
- css - 在 Wordpress 中的 3rd 方插件 css 之后加载自定义 css
- javascript - 在 DevTools 分析中观察到的神秘的、未归属的东西 - 这是什么?
- python - Boto3 无法从 DynamoDB 检索项目
- laravel - Laravel 图像响应慢
- windows - 有没有办法使用 Windows 的 caffe ssd 树中的 caffe 运行代码?
- vba - 是否有一个简单的 VBA 代码使用 Split() 函数来获取组合框的值列表,该组合框最初来自文本框作为字符串?