array(
[0] =>array(
 'name' => "a",
 'time' => '879798'),
[1] = >array(
 'name' => "a9",
 'time' => '85665565'),
[2] = >array(
 'name' => "hdhdjd",
 'time' => '8154465'),
[3] = >array(
 'name' => "a",
 'time' => '800000'),
[4] = >array(
 'name' => "dr",
 'time' => '789898'),
);
是一个已经按照time排序好的数组
现在要排这样array(
[0] =>array(
 'name' => "a",
 'time' => '879798'),
[1] = >array(
 'name' => "a",
 'time' => '800000'),

[2] = >array(
 'name' => "a9",
 'time' => '85665565'),
[3] = >array(
 'name' => "hdhdjd",
 'time' => '8154465'),[4] = >array(
 'name' => "dr",
 'time' => '789898'),
);把name相同的在一起。以第一个出现的次序为大。不知道有什么好方式啊,代码写的漂亮点的。

解决方案 »

  1.   

    $ar = array(
    0 =>array(
     'name' => "a",
     'time' => '879798'),
    1 => array(
     'name' => "a9",
     'time' => '856565'), //85665565 ? 示例数据有问题吧,看不出是按time排序的!
    2 =>array(
     'name' => "hdhdjd",
     'time' => '815465'),
    3 =>array(
     'name' => "a",
     'time' => '800000'),
    4 =>array(
     'name' => "dr",
     'time' => '789898'),
    );$result = array();
    $len = count($ar);
    for ($i = 0; $i < $len; $i ++) {
    $result[] = array_shift($ar);
    for ($j = 0; $j < count($ar); $j ++) {
    if ($ar[$j]['name'] == $result[count($result) - 1]['name']) {
    $result[] = array_splice($ar, $j, 1);
    break;
    }
    }
    }echo '<pre>';
    print_r($result);/*
    Array
    (
        [0] => Array
            (
                [name] => a
                [time] => 879798
            )    [1] => Array
            (
                [0] => Array
                    (
                        [name] => a
                        [time] => 800000
                    )        )    [2] => Array
            (
                [name] => a9
                [time] => 856565
            )    [3] => Array
            (
                [name] => hdhdjd
                [time] => 815465
            )    [4] => Array
            (
                [name] => dr
                [time] => 789898
            )    [5] => 
    )
    */
      

  2.   

    有点问题,修改一下:
    $result = array();
    $len = count($ar);
    for ($i = 0; $i < $len - 1; $i ++) {
    $result[] = array_shift($ar);
    for ($j = 0; $j < count($ar) - 1; $j ++) {
    if ($ar[$j]['name'] == $result[count($result) - 1]['name']) {
    $item = array_splice($ar, $j, 1);
    $result[] = $item[0];
    break;
    }
    }
    }echo '<pre>';
    print_r($result);Array
    (
        [0] => Array
            (
                [name] => a
                [time] => 879798
            )    [1] => Array
            (
                [name] => a
                [time] => 800000
            )    [2] => Array
            (
                [name] => a9
                [time] => 856565
            )    [3] => Array
            (
                [name] => hdhdjd
                [time] => 815465
            )    [4] => Array
            (
                [name] => dr
                [time] => 789898
            ))
      

  3.   

    按照time降序啊
    这个是我随便打的数字啊
    囧多大了一个数字
      

  4.   

    能不能再降低点复杂度啊
    O(n~2)了这个有点问题的是 name可能有多个重复 不止2个      break;不必要
      

  5.   

    <?php
    $arr = array(
                    array(
                             'name' => "a",
                             'time' => '879798'),
                    array(
                             'name' => "a9",
                              'time' => '85665565'),
                    array(
                             'name' => "dr",
                              'time' => '8154465'),
                    array(
                             'name' => "a",
                              'time' => '800000'),
                    array(
                             'name' => "dr",
                              'time' => '789898'),
    );$names = array();
    $index = array();array_walk($arr, function($val, $key){
                            global $names;
                            global $index;
                            $names[] = $val['name'];
                            $index[] = $key;
                    });array_multisort($names, $index, $arr);
    print_r($arr);
    ?>
      

  6.   

    我就知道有人会把数据整理成可用格式的
    $ar = array(
    0 =>array(
     'name' => "a",
     'time' => '879798'),
    1 => array(
     'name' => "a9",
     'time' => '856565'), //85665565 ? 示例数据有问题吧,看不出是按time排序的!
    2 =>array(
     'name' => "hdhdjd",
     'time' => '815465'),
    3 =>array(
     'name' => "a",
     'time' => '800000'),
    4 =>array(
     'name' => "dr",
     'time' => '789898'),
    );
    foreach($ar as $v) {
      $r1[] = $v['name'];
      $r2[] = $v['time'];
    }
    array_multisort($r1, SORT_ASC, SORT_STRING, $r2, SORT_DESC, $ar);
    print_r($ar);
    Array
    (
        [0] => Array
            (
                [name] => a
                [time] => 879798
            )    [1] => Array
            (
                [name] => a
                [time] => 800000
            )    [2] => Array
            (
                [name] => a9
                [time] => 856565
            )    [3] => Array
            (
                [name] => dr
                [time] => 789898
            )    [4] => Array
            (
                [name] => hdhdjd
                [time] => 815465
            ))
      

  7.   

    array_multisort看看这个函数,可对多维数组排序。
      

  8.   


    楼主的意思是name相同则使用index比较。 楼主说的时间是说原数组是按时间排序的。
      

  9.   

    上面array_multisort的方法貌似好 却都有问题
    我要的结果不是首先按照 name排序
    再按照time排序
    而是按照time顺序,同时得把name相同的摆在一起,name是不排序的。
    6楼和7楼的 如果把a换成k 就不是我要的效果了。
      

  10.   


    $ar = array(
    0 =>array(
     'name' => "ka",
     'time' => '879798'),
    1 => array(
     'name' => "a9",
     'time' => '856565'), 
    2 =>array(
     'name' => "hdhdjd",
     'time' => '815465'),
    3 =>array(
     'name' => "ka",
     'time' => '800000'),
    4 =>array(
     'name' => "dr",
     'time' => '789898'),
    );
    希望结果是
    $ar = array(
    0 =>array(
     'name' => "ka",
     'time' => '879798'),
    1 =>array(
     'name' => "ka",
     'time' => '800000'),
    2 => array(
     'name' => "a9",
     'time' => '856565'), 
    3 =>array(
     'name' => "hdhdjd",
     'time' => '815465'),4 =>array(
     'name' => "dr",
     'time' => '789898'),
    );
      

  11.   

    $ar数组本来就是按照time降序排序好的
      

  12.   

    楼主你转转脑子, 现time再name聚类能成立吗?先name聚类了再按time降序才行。
      

  13.   

    照楼主的意思,得这么做了:1,time稳定降序排列一次。
    2,按name稳定降序排列一次。楼主希望这样?
      

  14.   


    是的,3楼的代码有硬伤啊。晚上想了好久,越想越糊涂。。写了个递归查找的方法,效率不是一般的低。。
    $ar = array(
        0 => array(
            'name' => "ka",
            'time' => '879798'
        ),
        1 => array(
            'name' => "a9",
            'time' => '856565'
        ),
        2 => array(
            'name' => "hdhdjd",
            'time' => '815465'
        ),
        3 => array(
            'name' => "ka",
            'time' => '800000'
        ),
    4 => array(
    'name' => "ka",
    'time' => '790000'
    ),
        5 => array(
            'name' => "dr",
            'time' => '789898'
        )
    );$result   = array();
    $result[] = array_shift($ar);
    while(!findItem(&$ar, &$result)) {
    if (count($ar) > 0) {
    $result[] = array_shift($ar);
    findItem(&$ar, &$result);
    }
    else break;
    }function findItem($ar, $result) {
    for ($i = 0; $i < count($ar) - 1; $i ++) {
    if ($ar[$i]['name'] == $result[count($result) - 1]['name']) {
    $item = array_splice($ar, $i, 1);
    $result[] = $item[0];
    findItem(&$ar, &$result);
    }
    }
    return false;
    }echo '<pre>';
    print_r($result);
    Array
    (
        [0] => Array
            (
                [name] => ka
                [time] => 879798
            )
        [1] => Array
            (
                [name] => ka
                [time] => 800000
            )
        [2] => Array
            (
                [name] => ka
                [time] => 790000
            )
        [3] => Array
            (
                [name] => a9
                [time] => 856565
            )
        [4] => Array
            (
                [name] => hdhdjd
                [time] => 815465
            )
        [5] => Array
            (
                [name] => dr
                [time] => 789898
            )
    )
      

  15.   

    //又想到个方法,效率应该提高些了
    $ar = array(
        0 => array(
            'name' => "ka",
            'time' => '879798'
        ),
        1 => array(
            'name' => "a9",
            'time' => '856565'
        ),
        2 => array(
            'name' => "hdhdjd",
            'time' => '815465'
        ),
        3 => array(
            'name' => "ka",
            'time' => '800000'
        ),
    4 => array(
    'name' => "ka",
    'time' => '790000'
    ),
        5 => array(
            'name' => "dr",
            'time' => '789898'
        )
    );$names = array();
    for ($i = 0; $i < count($ar); $i ++) {
    if (!array_key_exists($ar[$i]['name'], $names)) $names[$ar[$i]['name']] = (count($names) + 1) * 100000;
    else $names[$ar[$i]['name']] += 1;
    $ar[$i]['rank'] = $names[$ar[$i]['name']];
    }function sortByRank($a, $b) {
    return $a['rank'] - $b['rank'];
    }
    usort($ar, 'sortByRank');foreach($ar as &$v) unset($v['rank']);
    echo '<pre>';
    print_r($ar);
      

  16.   

    natsort()函数
    http://php.net/manual/en/function.natsort.php
      

  17.   

    你这就不是什么排序了,聚类罢了
    $ar = array(
    0 =>array(
     'name' => "ka",
     'time' => '879798'),
    1 => array(
     'name' => "a9",
     'time' => '856565'), 
    2 =>array(
     'name' => "hdhdjd",
     'time' => '815465'),
    3 =>array(
     'name' => "ka",
     'time' => '800000'),
    4 =>array(
     'name' => "dr",
     'time' => '789898'),
    );
    $r = array();
    foreach($ar as $v) {
      if(! isset($r[$v['name']])) $r[$v['name']] = array();
      $r[$v['name']][] = $v;
    }$ar = array();
    foreach($r as $t) {
      foreach($t as $v)
        $ar[] = $v;
    }
    print_r($ar);
    Array
    (
        [0] => Array
            (
                [name] => ka
                [time] => 879798
            )    [1] => Array
            (
                [name] => ka
                [time] => 800000
            )    [2] => Array
            (
                [name] => a9
                [time] => 856565
            )    [3] => Array
            (
                [name] => hdhdjd
                [time] => 815465
            )    [4] => Array
            (
                [name] => dr
                [time] => 789898
            ))
      

  18.   

    恩就是这样name相同的非放一起。