Найти самое высокое и самое низкое значение по дате - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь разделить базу массива по его значению, я пытался использовать 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 голосов
/ 18 октября 2018

Вы можете зациклить только уникальные значения и использовать 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

0 голосов
/ 18 октября 2018

Метод грубой силы состоит в том, чтобы сначала повернуть массив к значению по группам, а затем рассчитать по этим группам:

// 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 ];
}                                                                                

См. Его на сайте 3v4l.org.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...