按日期查找最高和最低值

时间:2018-10-18 15:46:53

标签: php arrays date

我试图根据数组的值拆分数组,我尝试使用min和max,但无法弄清楚如何按每个键的值对数组进行分组

我的数组

Array
    (
        [2018-10-18] => 5
        [2018-10-19] => 5
        [2018-10-20] => 5
        [2018-10-21] => 5
        [2018-10-22] => 5
        [2018-10-23] => 5
        [2018-10-24] => 5
        [2018-10-25] => 5
        [2018-10-26] => 5
        [2018-10-27] => 5
        [2018-10-28] => 4
        [2018-10-29] => 4
        [2018-10-30] => 4
        [2018-10-31] => 4
        [2018-11-01] => 4
        [2018-11-02] => 4
        [2018-11-03] => 4
    )

所需结果

Array
(
  [0] => array(
    'start' => '2018-10-18',
     'end' => '2018-10-27',
     'value' => 5
  ),
  [1] => array(
    'start' => '2018-10-28',
     'end' => '2018-11-03',
     'value' => 4
  )

)

2 个答案:

答案 0 :(得分:0)

蛮力方法是先将数组旋转为按组的值,然后对这些组进行计算:

// Start with your source data in $array, then:
// Rotate the array so it's keyed by value. I think you were getting
// stuck on this step. The result is an array of value => array (dates)
$rotate = [];                                                                    
foreach ($array as $date => $value) {                                            
    $rotate[$value][] = $date;                                                   
}

// Now we'll just calculate the values we want                                                                            
$group = [];                                                                     
foreach ($rotate as $value => $dates) {                                          
    $group[] = [ 'start' => min($dates), 'end' => max($dates), 'value' => $value ];
}                                                                                

See it online at 3v4l.org.

答案 1 :(得分:0)

您只能循环唯一值,并使用array_intersect查找这些值在哪里。

foreach(array_unique($arr) as $v){
    $temp = array_keys(array_intersect($arr, [$v]));
    $new[] = ['start' => current($temp), 
              'end'   => end($temp),
              'value' => $v];
}
var_dump($new);

此输出:

array(2) {
  [0]=>
  array(3) {
    ["start"]=>
    string(10) "2018-10-18"
    ["end"]=>
    string(10) "2018-10-27"
    ["value"]=>
    int(5)
  }
  [1]=>
  array(3) {
    ["start"]=>
    string(10) "2018-10-28"
    ["end"]=>
    string(10) "2018-11-03"
    ["value"]=>
    int(4)
  }
}

https://3v4l.org/YO0cp