首页 > 解决方案 > 如何使用 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']

标签: phpjson

解决方案


您可以使用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

3v4l.org 上的演示

更新

正如@Andreas 在评论中指出的那样,我们可以使用第三个参数来获取以它们为键array_column的距离数组。location_id然后我们可以对数组进行排序并使用currentandkey来获得最小距离和相应的位置:

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

3v4l.org 上的演示


推荐阅读