现在我有一个数组是从数据表里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行业数据数据库
解决方案 »
- 如何把数组内的记录合并计算?
- dede发送邮件,邮件内容是动态页面,可以做到吗?
- 本地能导出excel2007,服务器却不能,为什么?
- 高手吗?请进入!
- 一个PHP + Mysql 做的开源 进销存 有网上试用版
- 为什么通过表单提交变量,GET方法只能取到其中的一部分呢?
- 有没有人做过计算机三级考试系统?
- 初学者,请大家帮帮忙:请问在PHP里怎样捕获用户退出登录这一事件(当然不是指按退出登录按钮,而是比方说与本网站相关的网页全部关闭或
- 在php中如何用exec()函数运行tar -xvcf命令
- 请问有什么函数可以把时间戳转换成整型直接加减
- 整合UCHOME到现有项目实现思路
- 新手问memcached 两个基本问题?请教!
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
))思路和方法都给你了,你总得思考思考吧