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相同的在一起。以第一个出现的次序为大。不知道有什么好方式啊,代码写的漂亮点的。
[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相同的在一起。以第一个出现的次序为大。不知道有什么好方式啊,代码写的漂亮点的。
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] =>
)
*/
$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
))
这个是我随便打的数字啊
囧多大了一个数字
O(n~2)了这个有点问题的是 name可能有多个重复 不止2个 break;不必要
$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);
?>
$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
))
楼主的意思是name相同则使用index比较。 楼主说的时间是说原数组是按时间排序的。
我要的结果不是首先按照 name排序
再按照time排序
而是按照time顺序,同时得把name相同的摆在一起,name是不排序的。
6楼和7楼的 如果把a换成k 就不是我要的效果了。
$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'),
);
2,按name稳定降序排列一次。楼主希望这样?
是的,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
)
)
$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);
http://php.net/manual/en/function.natsort.php
$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
))