如何使用PHP从JSON数组中获取最低值

moo*_*moo 0 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" }
          ]
    }]
}';
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']

Nic*_*ick 5

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

3v4l.org上的演示

更新资料

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

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)

3v4l.org上的演示