Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按日期和间隔排列的PHP组数组_Php_Arrays - Fatal编程技术网

按日期和间隔排列的PHP组数组

按日期和间隔排列的PHP组数组,php,arrays,Php,Arrays,我有这个数组 Array ( [0] => Array ( [date] => 2020-10-07 10:49:48 [content] => 1 ) [1] => Array ( [date] => 2020-10-08 13:49:48 [content] => 2 )

我有这个数组

  Array
  (
    [0] => Array
        (
            [date] => 2020-10-07 10:49:48
            [content] => 1
        )
    [1] => Array
        (
            [date] => 2020-10-08 13:49:48
            [content] => 2
        )
    [2] => Array
        (
            [date] => 2020-10-08 13:50:03
            [content] => 3
        )
  )
我想得到:

  Array
  (
    [0] => Array
        (
            [date] => 2020-10-07 10:49:48
            [content] => 1
        )
    [1] => Array
        (
            [date] => 2020-10-08 13:50:03
            [content] => 2, 3
        )
  )
如您所见,若元素之间的日期小于小时(例如),则这两个元素的内容都应使用更大的日期值分组。我只是不知道该怎么做才好

我知道了,但idk为什么我在数组中有额外的元素

        foreach ($result as $key => $value) {
            foreach ($result as $key2 => $value2) {
                if (abs(strtotime($value['date_added']) - strtotime($value2['date_added'])) <= 3600 && $key != $key2) {
                    $result[$key]['content'] = $value['content'] . ',' . $value2['content'];
                    unset($result[$key2]);
                }
            }
            $merged_array[] = $result[$key];
        }
foreach($result as$key=>$value){
foreach($key2=>$value2的结果){

如果(abs(strotime($value['date\u added'])-strotime($value 2['date\u added']))没有明确说明应该使用哪些时差。这里的解决方案总是计算到组的最高日期的时差

数组将按日期降序排序。最高日期设置为$groupDate。 使用foreach循环创建一个新的$result数组。 如果与$groupDate的日期差小于$intervalHour,则累加“内容”。在另一种情况下,将设置新的$groupDate。最后,结果数组将根据增加的日期再次排序

$data = [
  ['date' => '2020-10-07 10:49:48', 'content' => 1],
  ['date' => '2020-10-08 13:49:48', 'content' => 2],
  ['date' => '2020-10-08 13:50:03', 'content' => 3],
  ['date' => '2020-10-08 14:50:04', 'content' => 4],
];

$intervalHour = 1.0;

usort($data,function($a,$b){return $b['date'] <=> $a['date'];});

$groupDate = date_create($data[0]['date']);
$content = $data[0]['content'];
$result = [$data[0]];
$k = 0;
foreach($data as $i => $row){
  if($i == 0) continue;
  $diff = date_create($row['date'])->diff($groupDate);
  $diffHour = $diff->days * 24 + $diff->h + $diff->i/60 + $diff->s/3600;  
  if($diffHour < $intervalHour) {
    $content = $row['content'].','.$content;
  }
  else {
    ++$k;
    $groupDate = date_create($row['date']);
    $result[$k]['date'] = $groupDate->format('Y-m-d H:i:s');
    $content = $row['content'];
  }
  $result[$k]['content'] = $content;
}

usort($result,function($a,$b){return $a['date'] <=> $b['date'];});

echo '<pre>',var_export($result);
$intervalHour=2.0时的输出

$x = [1, 2];

foreach ($x as $key => $value) {
    echo $value;
    unset($x[1]);
}

问题是,
unset
命令不起作用。在数组上使用foreach时,将创建并迭代该数组的副本。如果要迭代可以动态更改的实例,则需要传递一个iterable对象

例如,以下内容将输出
12
,尽管未设置:

  $usedKeys = [];
  $dateContent  =[];

  foreach ($result as $key => $value) {
      if (in_array($key, $usedKeys)) {
          continue;
      }
      $usedKeys[] = $key;
      $dateContent[$key]['content'] = [$value['content']];
      foreach ($result as $key2 => $value2) {
          if (in_array($key2, $usedKeys)) {
              continue;
          }

          if (abs(strtotime($value['date']) - strtotime($value2['date'])) <= 3600 && $key != $key2) {
              $dateContent[$key]['content'][] = $value2['content'];
              $usedKeys[] = $key2;
          }
      }
  }

  $dateContent = array_map(function ($value) {
      return implode(',', $value['content']);
  }, $dateContent);
我认为最好的方法是使用OOP。但如果您只想使用forloops和Array,可以这样做:

$usedKeys=[];
$dateContent=[];
foreach($结果为$key=>$value){
if(在_数组中($key$usedKeys)){
继续;
}
$usedKeys[]=$key;
$dateContent[$key]['content']=[$value['content']];
foreach($key2=>$value2的结果){
if(在_数组中($key2,$usedKeys)){
继续;
}

如果(abs(strotime($value['date'])-strotime($value2['date'])你想说的是
date]=>2020-10-07 10:49:48[content]=>1,2
1和2元素有1分钟的差异,所以它们应该分组确定对不起,但是你重新组合了[content]=>2,3,3在哪里?以及[date]在哪里=>2020-10-08 13:49:48?当然应该删除3个元素并将其加入2。我们是否需要按顺序或以任何顺序进行检查。或者,如果第一条记录是
7:00
,第二条记录是
7:50
,第三条记录是
8:30
,会发生什么情况。是否应该合并这些记录?
$x = [1, 2];

foreach ($x as $key => $value) {
    echo $value;
    unset($x[1]);
}
  $usedKeys = [];
  $dateContent  =[];

  foreach ($result as $key => $value) {
      if (in_array($key, $usedKeys)) {
          continue;
      }
      $usedKeys[] = $key;
      $dateContent[$key]['content'] = [$value['content']];
      foreach ($result as $key2 => $value2) {
          if (in_array($key2, $usedKeys)) {
              continue;
          }

          if (abs(strtotime($value['date']) - strtotime($value2['date'])) <= 3600 && $key != $key2) {
              $dateContent[$key]['content'][] = $value2['content'];
              $usedKeys[] = $key2;
          }
      }
  }

  $dateContent = array_map(function ($value) {
      return implode(',', $value['content']);
  }, $dateContent);