现在我有一个数组是从数据表里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行业数据数据库

解决方案 »

  1.   

    $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'),
    );
    $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
            ))
      

  2.   

    嗯。那是不是能再精细点,比如
    $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用户的信息?
    如果想要这样 改如何进一步改进?
      

  3.   

    表示一些PHP有些算法细节的实现有点弱。。看下楼上能不能再往细里实现~
      

  4.   

    $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'),
    );
    $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
            ))思路和方法都给你了,你总得思考思考吧