【问题标题】:Finding the lowest value for specific key in a deeply nested array查找深度嵌套数组中特定键的最小值
【发布时间】:2017-01-05 19:07:07
【问题描述】:

给定一个具有以下结构的数组:

$orders = [
     0 => [
              'volume' => 1926,
              'lowPrice' => 1000.00,
              'date' => 2016-12-29 00:45:23
     ],
     1 => [
              'volume' => 145,
              'lowPrice' => 1009.99,
              'date' => 2016-12-31 14:23:51
     ],
     2 => [
              'volume' => 19,
              'lowPrice' => 985.99,
              'date' => 2016-12-21 09:37:13
     ],
     3 => [
              'volume' => 2984,
              'lowPrice' => 749.99,
              'date' => 2017-01-01 19:37:22
     ],
     // ...
]

我正在寻找最高效的方法来找到lowPrice 的最低值。 $orders 的大小很可能超过 500 个项目。对于给定的数组,结果如下:

$lowestPrice = $this->findLowestPrice($orders);

echo $lowestPrice; // 749.99

【问题讨论】:

  • 您想在稍微变化的数据集上一次或多次找到最低值吗?如果只有一次:迭代(O(n)),如果多次:保留某种数据结构,例如最小堆(O(n log n) 用于更新,O(1) 用于获取最小值)。
  • 数据集$orders 来自哪里?数据库? json? xml?
  • @RolandStarke 这就是我目前正在做的事情,但我觉得它效率低下。
  • @cmorrissey 数据集来自 json 源。
  • @EricS。您不会注意到性能差异。这里的所有解决方案都需要

标签: php algorithm sorting


【解决方案1】:

提取lowPrice的数组并找到min()

echo min(array_column($orders, 'lowPrice'));

由于这些看起来是浮点数,您可能需要number_format()money_format()

【讨论】:

    【解决方案2】:

    如果您只对最低价格的值感兴趣(而不是数组中的索引或其他内容),您可以使用array_reduce

    $orders = [
         0 => [
                  'volume' => 1926,
                  'lowPrice' => 1000.00,
                  'date' => "2016-12-29 00:45:23"
         ],
         1 => [
                  'volume' => 145,
                  'lowPrice' => 1009.99,
                  'date' => "2016-12-31 14:23:51"
         ],
         2 => [
                  'volume' => 19,
                  'lowPrice' => 985.99,
                  'date' => "2016-12-21 09:37:13"
         ],
         3 => [
                  'volume' => 2984,
                  'lowPrice' => 749.99,
                  'date' => "2017-01-01 19:37:22"
         ],
    ];
    
    $lowestPrice = array_reduce(
        $orders,
        function($c, $v)
        {
            if ($c === null)
                return $v["lowPrice"];
    
            return $v["lowPrice"] < $c ? $v["lowPrice"] : $c;
        }
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 2019-07-18
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多