Присвойте максимальную температуру определенному дню в многомерном массиве - PullRequest
0 голосов
/ 05 июля 2018

Я уверен, что название немного расплывчато, но я надеюсь, что пример лучше объяснит проблему.

Итак, у меня есть массив, который содержит список из 40 результатов. В каждом из результатов есть временная метка, которую я перевожу на определенный день, например, «понедельник» и температуру. Дело в том, что за один день может быть до 8 временных периодов. И температура для каждого периода. Мне нужно как-то определить, как назначить максимальную температуру для конкретного дня, основываясь на всех температурах, связанных с этим днем.

Итак, массив выглядит примерно так:

array (size=40)
  0 => 
      'dt' => int 1530802800
      'main' => 
          'temp' => float 29.14
  1 => 
      'dt' => int 1530813600
      'main' => 
          'temp' => float 25.63
  ...

И чего бы я хотел добиться, примерно так:

array 
      monday => 27.65
      tuesday => 24.65
...

Я могу создать два отдельных массива, которые содержат все дни и все температуры, но я не уверен, как связать все температуры, относящиеся к определенному дню, поскольку у меня может появиться один и тот же день в этом массиве до 8 раз, а затем рассчитать самую высокую температуру для этого дня.

У меня есть что-то вроде:

0 => monday
1 => monday
2 => monday
3 => tuesday

и другой массив:

0 => 23.56
1 => 34.66
2 => 12.44
3 => 34.44

То, что я хотел бы, по крайней мере, иметь что-то вроде этого

monday => array(
    0 => 23.56
    1 => 34.66
    2 => 12.44
),
tueasday => array(
    0 => 34.56
    1 => 34.66
    2 => 13.44
)
...

Надеюсь, это было достаточно ясно.

Любая помощь приветствуется.

Спасибо.

Ответы [ 4 ]

0 голосов
/ 05 июля 2018

Похоже, что вам не хватает концепции для динамического построения массива из ключей.

Если вы перебираете свой исходный массив, преобразуйте временную метку в день. Вы сказали, что уже знаете, как это сделать. Затем используйте этот день в качестве ключа для построения массива результатов.

foreach ($data as $measurement) {
    $day = however_you_convert($measurement['dt']);
    //       ↓ defines the group
    $result[$day][] = $measurement['main']['temp'];
    //           ↑ adds the value to an array under that group
}

Это преобразует ваши данные в сгруппированную структуру, показанную в последнем блоке кода в вашем вопросе. Оттуда вы можете использовать sort или max, чтобы получить наибольшее значение.

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

0 голосов
/ 05 июля 2018

На основании того, что вы нам показываете:

$days = array(
    0 => 'monday',
    1 => 'monday',
    2 => 'monday',
    3 => 'tuesday'
);

$temp = array(
    0 => 23.56,
    1 => 34.66,
    2 => 12.44,
    3 => 34.44
);

Если вы уверены, что у вас 2 массива одинакового размера:

$new_array = array();

foreach ($days as $key=> $day) {
    $new_array[$day][] = $temp[$key];
}

var_dump($new_array);

Вывод:

array (size=2)
  'monday' => array (size=3)
    0 => float 23.56
    1 => float 34.66
    2 => float 12.44
  'tuesday' => array (size=1)
    0 => float 34.44

Теперь, если вам нужен массив с указанием дня и максимальной температуры каждого дня:

$result = array();

foreach($new_array as $day => $temp_array) {
    $result[$day] = max($new_array[$day]);
}

var_dump($result);

Вывод:

array (size=2)
  'monday' => float 34.66
  'tuesday' => float 34.44

Возможно, есть лучший способ добиться этого, но, в соответствии с вашим вопросом и тем, что вы просите, это должно сделать работу, я надеюсь, что это поможет!

0 голосов
/ 05 июля 2018

Начиная с вашего исходного массива (не двух отдельных). Получите день из метки времени и назначьте его как ключ к результату. Проверьте, меньше ли текущее значение, и если да, замените его новым:

foreach($array as $values) {
    $day = strtolower(date('l', $values['dt']));
    if(!isset($result[$day]) || $result[$day] < $values['main']['temp']) {
        $result[$day] = $values['main']['temp'];
    }
}

Вы также можете создать массив по дням со всеми температурами:

foreach($array as $values) {
    $day = strtolower(date('l', $values['dt']));
    $result[$day][] = $values['main']['temp'];
}

Затем вычислите максимумы для каждого дня:

$max = array_map('max', $result);
0 голосов
/ 05 июля 2018

теперь, когда у вас есть это:

$days = ["0" => "monday",
"1" => "monday",
"2" => "monday",
"3" => "tuesday"];

$temps = [
0 => 23.56,
1 => 34.66,
2 => 12.44,
3 => 34.44
];

Вы можете сделать это:

$result = [];

foreach($days as $key => $day){
    if(!isset($result[$day]))
        $result[$day] = $temps[$key];
    if($temps[$key] > $result[$day])
        $result[$day] = $temps[$key];
}

var_dump($result);

Выход:

array(2) {
  ["monday"]=>
  float(34.66)
  ["tuesday"]=>
  float(34.44)
}

Надеюсь, это поможет вам найти оптимальное решение.

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