按日期和间隔排列的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);