将最高温度分配给多维数组中的特定日期

时间:2018-07-05 14:52:46

标签: php arrays multidimensional-array

我确定标题有点含糊,但我希望示例可以更好地说明问题。

所以,我有一个包含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 :(得分:1)

从原始阵列(不是两个单独的阵列)开始。从时间戳记中获取日期并将其指定为结果的关键字。检查当前值是否较小,如果是,则替换为新值:

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);

答案 1 :(得分:1)

您似乎缺少实现此目标的概念是根据键动态构造数组。

如果迭代原始数组,则将时间戳转换为一天。您已经说过您已经知道该怎么做。然后以当天作为构建结果数组的键。

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
}

这会将您的数据转换为问题中最后一个代码块中所示的分组结构。从那里,您可以使用sortmax来获得最高价值。

如果不需要这些值集,则可以随时跟踪最大值,如this other answer所示。

答案 2 :(得分:0)

现在您已经拥有了:

$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)
}

希望它可以帮助您获得最佳解决方案。

答案 3 :(得分:0)

根据您向我们展示的内容:

$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

也许有更好的方法来实现它,但是根据您的问题以及您要求它做什么,我希望它会有所帮助!