如何在PHP中从多维数组中获取最高和最低值以及总和

3
我已经尝试使用这个例子 Return index of highest value in an array,但它并不适用于多维数组。我已经尝试使用ARRAY_COLUMN()、array_values()、array_shift、Max和Min等方法,但它们没有得到我需要的信息。我想要能够循环遍历并获取到:[pricing],然后检查嵌套数组中哪一个最高和最低。就像下面这样,哪一天的交易总额最高和最低。
[2017-09-22] 
[2017-09-23] 

显然,[2017-09-23] 是一个简单的例子,我只是不想为了帮助别人而添加更多的代码。
我创建的数组看起来像这样:
 Array
   (
   [2017-09-23] => Array
    (
        [0] => Array
            (
                [timestamp] => 1506169387000
                [pricing] => 9.5470
                [qty] => 25
                [total] => 238.675
                [date] => 2017-09-23
            )

    )

[2017-09-22] => Array
    (
        [0] => Array
            (
                [timestamp] => 1506093083000
                [pricing] => 9.6300
                [qty] => 25
                [total] => 240.75
                [date] => 2017-09-22
            )

        [1] => Array
            (
                [timestamp] => 1506077220000
                [pricing] => 8.7190
                [qty] => 13
                [total] => 113.347
                [date] => 2017-09-22
            )

        [2] => Array
            (
                [timestamp] => 1506077109000
                [pricing] => 8.6800
                [qty] => 83
                [total] => 720.44
                [date] => 2017-09-22
            )

        [3] => Array
            (
                [timestamp] => 1506065258000
                [pricing] => 8.7100
                [qty] => 25
                [total] => 217.75
                [date] => 2017-09-22
            )

    )

在上面的示例中,我希望它创建一个仅包含以下内容的新数组
date -> last timestamp -> Highest pricing -> Lowest lowest -> Total of all Totals -> first Timestamp

编辑:最后和第一个时间戳基本上是第一个和最后一个索引,因此在这种情况下:

[timestamp] => 1506093083000   and    [timestamp] => 1506065258000

或者索引 [0] 和索引 [3]

最后一个时间戳是按数组值顺序出现的最后一个时间戳,还是与其他时间戳进行比较得到的值? - kip
我会编辑它! - Dynamite Media
1个回答

3

您提出的数组:

$array = array (
  '2017-09-23' => 
  array (
    0 => 
    array (
      'timestamp' => '1506169387000',
      'pricing' => '9.5470',
      'qty' => '25',
      'total' => '238.675',
      'date' => '2017-09-23',
    ),
  ),
  '2017-09-22' => 
  array (
    0 => 
    array (
      'timestamp' => '1506093083000',
      'pricing' => '9.6300',
      'qty' => '25',
      'total' => '240.75',
      'date' => '2017-09-22',
    ),
    1 => 
    array (
      'timestamp' => '1506077220000',
      'pricing' => '8.7190',
      'qty' => '13',
      'total' => '113.347',
      'date' => '2017-09-22',
    ),
    2 => 
    array (
      'timestamp' => '1506077109000',
      'pricing' => '8.6800',
      'qty' => '83',
      'total' => '720.44',
      'date' => '2017-09-22',
    ),
    3 => 
    array (
      'timestamp' => '1506065258000',
      'pricing' => '8.7100',
      'qty' => '25',
      'total' => '217.75',
      'date' => '2017-09-22',
    ),
  ),
);

要获取值,也许可以使用array_map函数,而且array_column函数是其中的关键,尝试使用它:

$values = array_map(function($dates) {
    $timestamps = array_column($dates, 'timestamp');
    $pricings = array_column($dates, 'pricing');
    return [
        'max_pricing' => max($pricings),
        'lowest_pricing' => min($pricings),
        'total_of_totals' => array_sum(array_column($dates, 'total')),
        'first_timestamp' => reset($timestamps),
        'last_timestamp' => end($timestamps),
    ];
}, $array);

$values 是一个包含所需过滤值的数组:

Array
(
    [2017-09-23] => Array
        (
            [max_pricing] => 9.5470
            [lowest_pricing] => 9.5470
            [total_of_totals] => 238.675
            [first_timestamp] => 1506169387000
            [last_timestamp] => 1506169387000
        )

    [2017-09-22] => Array
        (
            [max_pricing] => 9.6300
            [lowest_pricing] => 8.6800
            [total_of_totals] => 1292.287
            [first_timestamp] => 1506093083000
            [last_timestamp] => 1506065258000
        )

)

编辑

获取[first_timestamp][last_timestamp]的价格。

$values = array_map(function($dates) {
    $timestamps = array_column($dates, 'timestamp');
    $pricings = array_column($dates, 'pricing');
    return [
        'max_pricing' => max($pricings),
        'lowest_pricing' => min($pricings),
        'total_of_totals' => array_sum(array_column($dates, 'total')),
        'first_timestamp' => [
            'value' => reset($timestamps),
            'pricing' => $pricings[each($timestamps)['key']]
        ],
        'last_timestamp' => [
            'value' => end($timestamps),
            'pricing' => $pricings[each($timestamps)['key']]
        ]
    ];
}, $array);

我在时间戳中加入了一个数组,其中包含这些数值和定价。
Array
(
    [2017-09-23] => Array
        (
            [max_pricing] => 9.5470
            [lowest_pricing] => 9.5470
            [total_of_totals] => 238.675
            [first_timestamp] => Array
                (
                    [value] => 1506169387000
                    [pricing] => 9.5470
                )

            [last_timestamp] => Array
                (
                    [value] => 1506169387000
                    [pricing] => 9.5470
                )

        )

    [2017-09-22] => Array
        (
            [max_pricing] => 9.6300
            [lowest_pricing] => 8.6800
            [total_of_totals] => 1292.287
            [first_timestamp] => Array
                (
                    [value] => 1506093083000
                    [pricing] => 9.6300
                )

            [last_timestamp] => Array
                (
                    [value] => 1506065258000
                    [pricing] => 8.7100
                )

        )

)

它没有打印出来,我有什么遗漏吗? - Dynamite Media
使用 print_r($values); - kip
这就是我所做的... 我明白了,我没有注意到你称它为 $array,而我的是 newArray... 太多时间花在这上面了!这很好用,我认为也会帮助其他人。 - Dynamite Media
我看到我有点搞砸了。我还需要获取[first_timestamp]和[last_timestamp]的定价。这是可以做到的还是需要一个新的函数? - Dynamite Media

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接