现在我有一个数组是从数据表里query过来按时间AES排序的。
$list = array(0 => array('createtime' => 90,'message'=>'ad','user'=>'a'),
1 => array('createtime' => 91,'message'=>'ae','user'=>'b'),
2 => array('createtime' => 93,'message'=>'ae','user'=>'b'),
3 => array('createtime' => 93,'message'=>'ae','user'=>'c'),
4 => array('createtime' => 94,'message'=>'ah','user'=>'d'),
5 => array('createtime' => 99,'message'=>'ah','user'=>'a'),
6 => array('createtime' => 100,'message'=>'ah','user'=>'a'));
现在我想调整让它变成这样:
$list = array(0 => array('createtime' => 90,'message'=>'ad','user'=>'a'),
1 => array('createtime' => 91,'message'=>'ae+ae','user'=>'b'),
2 => array('createtime' => 93,'message'=>'ae','user'=>'c'),
3 => array('createtime' => 94,'message'=>'ah','user'=>'d'),
4 => array('createtime' => 99,'message'=>'ah+ah','user'=>'a'));
就是说在createtime相差5以内同一个user的归到一起,message信息增加,user不变,createtime为最初的。
我初步是这么写的:
$diff = 0;
$count = 0;
$d = array();
$j = array();
for($i = 1;isset($list[$i]);){
if ($list[$i]['user'] != $list[$i-1-$count]['user']) {
if (!in_array($list[$i]['user'], $d)) {
$d[$diff] = $list[$i]['user'];
$j[$diff] = $i;
$count++;
$diff++;
$i++;
continue;
} else {
$i++;
$count++;
continue;
}
}
if($list[$i]['createtime'] - $list[$i-1-$count]['createtime'] < 5){
$list[$i-1-$count]['message'] = $list[$i-1-$count]['message'].'<br>'.$list[$i]['message'];
array_splice($list,$i,1);
} else if ($count == 0) {
$i++;
} else {
$i = $j[0] + 1;
$count = 0;
$diff = 0;
$d = array();
$j = array();
}
}
但是发现它不能处理开头给出的数组,因为这个重新调整的算法得考虑后续数据表里更多用户在createtime 5秒内的发表message的一些情况,怎样才能向后兼容这些情况又能满足最初的需求?算法PHP行业数据数据库
$list = array(0 => array('createtime' => 90,'message'=>'ad','user'=>'a'),
1 => array('createtime' => 91,'message'=>'ae','user'=>'b'),
2 => array('createtime' => 93,'message'=>'ae','user'=>'b'),
3 => array('createtime' => 93,'message'=>'ae','user'=>'c'),
4 => array('createtime' => 94,'message'=>'ah','user'=>'d'),
5 => array('createtime' => 99,'message'=>'ah','user'=>'a'),
6 => array('createtime' => 100,'message'=>'ah','user'=>'a'));
现在我想调整让它变成这样:
$list = array(0 => array('createtime' => 90,'message'=>'ad','user'=>'a'),
1 => array('createtime' => 91,'message'=>'ae+ae','user'=>'b'),
2 => array('createtime' => 93,'message'=>'ae','user'=>'c'),
3 => array('createtime' => 94,'message'=>'ah','user'=>'d'),
4 => array('createtime' => 99,'message'=>'ah+ah','user'=>'a'));
就是说在createtime相差5以内同一个user的归到一起,message信息增加,user不变,createtime为最初的。
我初步是这么写的:
$diff = 0;
$count = 0;
$d = array();
$j = array();
for($i = 1;isset($list[$i]);){
if ($list[$i]['user'] != $list[$i-1-$count]['user']) {
if (!in_array($list[$i]['user'], $d)) {
$d[$diff] = $list[$i]['user'];
$j[$diff] = $i;
$count++;
$diff++;
$i++;
continue;
} else {
$i++;
$count++;
continue;
}
}
if($list[$i]['createtime'] - $list[$i-1-$count]['createtime'] < 5){
$list[$i-1-$count]['message'] = $list[$i-1-$count]['message'].'<br>'.$list[$i]['message'];
array_splice($list,$i,1);
} else if ($count == 0) {
$i++;
} else {
$i = $j[0] + 1;
$count = 0;
$diff = 0;
$d = array();
$j = array();
}
}
但是发现它不能处理开头给出的数组,因为这个重新调整的算法得考虑后续数据表里更多用户在createtime 5秒内的发表message的一些情况,怎样才能向后兼容这些情况又能满足最初的需求?算法PHP行业数据数据库
0 => array('createtime' => 90,'message'=>'ad','user'=>'a'),
1 => array('createtime' => 91,'message'=>'ae','user'=>'b'),
2 => array('createtime' => 93,'message'=>'ae','user'=>'b'),
3 => array('createtime' => 93,'message'=>'ae','user'=>'c'),
4 => array('createtime' => 94,'message'=>'ah','user'=>'d'),
5 => array('createtime' => 99,'message'=>'ah','user'=>'a'),
6 => array('createtime' => 100,'message'=>'ah','user'=>'a'),
);
$len = count($list);
$st = 0;
for($i=1; $i<$len; $i++) {
if($list[$i]['user'] == $list[$st]['user'] && $list[$i]['createtime'] < $list[$st]['createtime']+5) {
$list[$st]['message'] .= ',' . $list[$i]['message'];
unset($list[$i]);
}else $st = $i;
}
print_r(array_values($list));
Array
(
[0] => Array
(
[createtime] => 90
[message] => ad
[user] => a
) [1] => Array
(
[createtime] => 91
[message] => ae,ae
[user] => b
) [2] => Array
(
[createtime] => 93
[message] => ae
[user] => c
) [3] => Array
(
[createtime] => 94
[message] => ah
[user] => d
) [4] => Array
(
[createtime] => 99
[message] => ah,ah
[user] => a
))
$list = array(
0 => array('createtime' => 90,'message'=>'ad','user'=>'a'),
1 => array('createtime' => 91,'message'=>'ae','user'=>'a'),
2 => array('createtime' => 93,'message'=>'ae','user'=>'c'),
3 => array('createtime' => 93,'message'=>'ae','user'=>'a'),
4 => array('createtime' => 94,'message'=>'ah','user'=>'a'),
5 => array('createtime' => 99,'message'=>'ah','user'=>'b'),
6 => array('createtime' => 100,'message'=>'ah','user'=>'a'),
);
这样按之前的算法输出后
Array (
[0] => Array ( [createtime] => 90 [message] => ad,ae [user] => a )
[1] => Array ( [createtime] => 93 [message] => ae [user] => c )
[2] => Array ( [createtime] => 93 [message] => ae,ah [user] => a )
[3] => Array ( [createtime] => 99 [message] => ah [user] => b )
[4] => Array ( [createtime] => 100 [message] => ah [user] => a ) )
但其实如果能输出像这样的是不是会更好呢?
Array (
[0] => Array ( [createtime] => 90 [message] => ad,ae,ae,ah [user] => a )
[1] => Array ( [createtime] => 93 [message] => ae [user] => c )
[2] => Array ( [createtime] => 99 [message] => ah [user] => b )
[3] => Array ( [createtime] => 100 [message] => ah [user] => a ) )
user为a的createtime在相差5之内合并在一起而不受user为c时阻断合并user-a用户的信息?
如果想要这样 改如何进一步改进?
0 => array('createtime' => 90,'message'=>'ad','user'=>'a'),
1 => array('createtime' => 91,'message'=>'ae','user'=>'a'),
2 => array('createtime' => 93,'message'=>'ae','user'=>'c'),
3 => array('createtime' => 93,'message'=>'ae','user'=>'a'),
4 => array('createtime' => 94,'message'=>'ah','user'=>'a'),
5 => array('createtime' => 99,'message'=>'ah','user'=>'b'),
6 => array('createtime' => 100,'message'=>'ah','user'=>'a'),
);
$st = array();
foreach($list as $i=>$r) {
$k = $r['user'];
if(isset($st[$k]) && $r['user'] == $list[$st[$k]]['user'] && $r['createtime'] < $list[$st[$k]]['createtime']+5) {
$list[$st[$k]]['message'] .= ',' . $r['message'];
unset($list[$i]);
}else $st[$k] = $i;
}
print_r(array_values($list));
Array
(
[0] => Array
(
[createtime] => 90
[message] => ad,ae,ae,ah
[user] => a
) [1] => Array
(
[createtime] => 93
[message] => ae
[user] => c
) [2] => Array
(
[createtime] => 99
[message] => ah
[user] => b
) [3] => Array
(
[createtime] => 100
[message] => ah
[user] => a
))思路和方法都给你了,你总得思考思考吧