Как получить максимальные значения многомерного массива за 30 дней - PullRequest
0 голосов
/ 01 апреля 2019

Я создаю исторический график, используя ChartJS.И мне нужно отфильтровать значения массива 30 дней назад

У меня есть массив со значениями ниже:

[0] => Array
    (
        [datetime] => 4/1/2019 4:00:00 PM - 5:00:00 PM
        [value_raw] => 100
    )

[1] => Array
    (
        [datetime] => 4/1/2019 3:00:00 PM - 4:00:00 PM
        [value_raw] => 101
    )

[2] => Array
    (
        [datetime] => 4/1/2019 2:00:00 PM - 3:00:00 PM
        [value_raw] => 99
    )

Массив имеет большое содержимое и содержит до 5 месяцев значениекаждый час каждый день

Это мой текущий php-код для ярлыков в ChartJS Script:

LABELS CODE:

labels: [
    <?php
        for($i=0; $i<=30; $i++)
        {
         $label = date('n/d/Y', strtotime('-'.$i.' days',strtotime(date('n/d/Y'))));
         echo '"'.$label.'",';
        }
    ?>
],

Результат:

4/01/2019, 3/31/2019, 3/30/2019, 3/29/2019

Однако у меня возникают трудности с тем, как я собираюсь получить эквивалентное МАКС-значение в день параллельно / в соответствии с моим кодом этикеток.

КОД ДАННЫХ:

data: [
    <?php
    foreach ($my_array as $key => $value) {
        for($i=0; $i<=30; $i++)
        {
            $label = date('n/d/Y', strtotime('-'.$i.' days',strtotime(date('n/d/Y'))));

             if ($label == changeFormat($value[datetime]))
             {
                     echo $value['value_raw'].',';
             }
        }
    }
    ?>
],

Мой ожидаемый результат должен быть МАКС. Значением дня последних 30 дней:

Пример:

DATE        VALUE
4/01/2019   99
3/31/2019   101
3/30/2019   100
3/29/2019   95

Результат:

99, 101, 100, 95

Ответы [ 4 ]

0 голосов
/ 02 апреля 2019

Привет, ребята, вот что я придумал:

data: [
<?php
  for($i=0; $i<=7; $i++)
  {
      $date = date('n/j/Y', strtotime('-'.$i.' days',strtotime(date('n/d/Y'))));

      $filterBy     = $date;
      $new_array    = array_filter($my_array, function ($array) use ($filterBy) {
          $datetime = date("n/j/Y",changeFormat($array['datetime']));
          if ($datetime == $filterBy)
          {
            return $datetime;
          }
      });

      if (count($new_array) != 0)
      {
        $max_value = max(array_column($new_array, 'value_raw'));
        echo number_format($max_value, 0, '.', '').",";
      }
  }
?> ],
0 голосов
/ 01 апреля 2019

Вы можете запустить запрос, если используете mysql для группировки по дате и получения максимального значения,

SELECT MAX(value_raw), DATE(mydate) DateOnly FROM a_table where mydate BETWEEN (NOW() - INTERVAL 30 DAY) AND NOW() GROUP BY DateOnly;
0 голосов
/ 01 апреля 2019

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

// remove dates older than 30 days
function remove30DayBeforeDates($a) {
    $pieces = explode(' ', $a['datetime']);
    return strtotime($pieces[0]) > strtotime('-30 days');
}
// remove dates older than 30 days

$array = array(
    array(
        'datetime' => '3/29/2019 4:00:00 PM - 5:00:00 PM',
        'value_raw' => 95
    ), array(
        'datetime' => '4/01/2019 3:00:00 PM - 4:00:00 PM',
        'value_raw' => 99
    ), array(
        'datetime' => '3/31/2019 2:00:00 PM - 3:00:00 PM',
        'value_raw' => 101
    ), array(
        'datetime' => '2/10/2019 2:00:00 PM - 3:00:00 PM',
        'value_raw' => 112
    ), array(
        'datetime' => '3/30/2019 2:00:00 PM - 3:00:00 PM',
        'value_raw' => 100
        ));

$array = array_filter($array, "remove30DayBeforeDates");

// sort array based on the date

function check($a, $b) {
    $pieces1 = explode(' ', $a['datetime']);
    $pieces2 = explode(' ', $b['datetime']);
    return strtotime($pieces2[0]) <=> strtotime($pieces1[0]); // use spaceship operator
}

// sort array based on the date

usort($array, "check");

$value_raw = array_column($array, 'value_raw'); // get array of values from column "value_raw"

print_r(implode(',',$value_raw));
0 голосов
/ 01 апреля 2019
    $today= date('Y-m-d');
    $thirty_days_ago = date('Y-m-d', strtotime('-30 days'));

затем, в построителе запросов БД,

    $data = DB::table('your_table_name')
           ->where('datetime','>='$thirty_days_ago)
           ->where('datetime','<='$today)
           ->whereRaw('value_raw = (select max(`value_raw`) from your_table_name)')
           ->select('datetime','value_raw')
           ->groupBy('datetime')->get();
...