比如我一个数组$fileArray 有如下元素
F_20110411223434_2.csv
F_20110411223434_1.csv
F_20110311223434_2.csv
F_20110311223434_3.csv
F_20110311223434_1.csv
F_20110214143527_1.csv第二域是时间(格式:年月日小时分秒)
第三域是序号 我需要进行如下排序 谁给一个最简单高效的方法 最好写一个函数 数组作为参数传进去 返回排序后的数组
我需要把时间越新的排在前面 如果时间完全一致的 按序号升序排列 比如上面数据 排序后 应该是这样的
F_20110411223434_1.csv
F_20110411223434_2.csv
F_20110311223434_1.csv
F_20110311223434_2.csv
F_20110311223434_3.csv
F_20110214143527_1.csv
F_20110411223434_2.csv
F_20110411223434_1.csv
F_20110311223434_2.csv
F_20110311223434_3.csv
F_20110311223434_1.csv
F_20110214143527_1.csv第二域是时间(格式:年月日小时分秒)
第三域是序号 我需要进行如下排序 谁给一个最简单高效的方法 最好写一个函数 数组作为参数传进去 返回排序后的数组
我需要把时间越新的排在前面 如果时间完全一致的 按序号升序排列 比如上面数据 排序后 应该是这样的
F_20110411223434_1.csv
F_20110411223434_2.csv
F_20110311223434_1.csv
F_20110311223434_2.csv
F_20110311223434_3.csv
F_20110214143527_1.csv
natsort($arr); //用“自然排序”算法对数组排序
foreach($arr as $str) echo $str."<br />";
这个应该不行,要用multisort
function customSort($arr) {
$arrTMP1 = $arrResult = array();
foreach($arr as $item) {
$part1 = substr($item,0,15);
$part2 = substr($item,16,6);
$arrTMP1[$part1][] = $part2;
}
$arrTMP2 = array_keys($arrTMP1);
natsort($arrTMP2);
$arrTMP2 = array_reverse($arrTMP2);
foreach($arrTMP2 as $item) {
if (count($arrTMP1[$item]) < 2) $arrResult[] = $item.$arrTMP1[$item][0];
else {
$arrtmp = $arrTMP1[$item];
natsort($arrtmp);
$arrtmp = array_values($arrtmp);
for ($i = 0; $i < count($arrtmp); $i ++) $arrResult[] = $item.$arrtmp[$i];
}
}
return $arrResult;
}
var_dump(customSort($arr));
$arr = array('F_20110411223434_2.csv','F_20110411223434_1.csv','F_20110311223434_2.csv','F_20110311223434_3.csv','F_20110311223434_1.csv','F_20110214143527_1.csv');
function customSort($arr) {
$arrTMP1 = $arrResult = array();
foreach($arr as $item) {
$part1 = substr($item,0,16); //4楼的代码这一句写错了
$part2 = substr($item,16,6); //把原始数组的元素拆分为两个部分,part1->F_20110411223434 part2->_2.csv
$arrTMP1[$part1][] = $part2; //把原始数组转换为二维数组. array(part1=>array(part2))
}
$arrTMP2 = array_keys($arrTMP1);
natsort($arrTMP2);
$arrTMP2 = array_reverse($arrTMP2); //对原始数组的前半部分自然排序后反转,实现降序自然排序
foreach($arrTMP2 as $item) {
if (count($arrTMP1[$item]) < 2) $arrResult[] = $item.$arrTMP1[$item][0];
else {
$arrtmp = $arrTMP1[$item];
natsort($arrtmp);
$arrtmp = array_values($arrtmp);
for ($i = 0; $i < count($arrtmp); $i ++) $arrResult[] = $item.$arrtmp[$i];
}
}
return $arrResult;
}
foreach(customSort($arr) as $item) echo $item."\n";
/*输出结果
F_20110411223434_1.csv
F_20110411223434_2.csv
F_20110311223434_1.csv
F_20110311223434_2.csv
F_20110311223434_3.csv
F_20110214143527_1.csv
*/
$arr = array('F_20110411223434_2.csv','F_20110411223434_1.csv','F_20110311223434_2.csv','F_20110311223434_3.csv','F_20110311223434_1.csv','F_20110214143527_1.csv');
function sort_my($e1, $e2) {
// F_20110411223434_2.csv
// c = F 标志
// t = 20110411223434 时间
// i = 2.csv 序号 // (int)i = 2
list($c1,$t1,$i1) = explode('_', $e1);
list($c2,$t2,$i2) = explode('_', $e2);
// 如果你要用标志另外自己写
// 不同时间
if($t1 > $t2) {
return -1;
} elseif($t1 < $t2) {
return 1;
}
$i1 = (int)$i1;
$i2 = (int)$i2;
// 相同时间
if($i1 > $i2) {
return 1;
} elseif($i1 < $i2) {
return -1;
}
return 0;
}
usort($arr, 'sort_my');
var_dump($arr);
echo '<pre>';
//把你的数组稍微改了一下,以便检查多位整数的排序
$arr = array('F_20110411223434_2.csv','F_20110411223434_1.csv','F_20110311223434_12.csv','F_20110311223434_3.csv','F_20110311223434_1.csv','F_20110214143527_1.csv');foreach ($arr as $key => $row) {
$arr1= explode('_',$row);
$date[$key] = $arr1[1];
$num[$key] = str_replace('.csv','',$arr1[2]);
}array_multisort($date, SORT_DESC, $num, SORT_NUMERIC,SORT_ASC, $arr);
print_r($arr);?>
$s = <<< TXT
F_20110411223434_2.csv
F_20110411223434_1.csv
F_20110311223434_2.csv
F_20110311223434_3.csv
F_20110311223434_1.csv
F_20110214143527_1.csv
TXT;$ar = split("[\r\n]+", $s);function mysort($ar) {
foreach($ar as $v) {
list(,$r1[], $r2[]) = split("[_.]", $v);
}
array_multisort($r1, SORT_DESC, $r2, SORT_ASC, $ar);
return $ar;
}print_r(mysort($ar));
Array
(
[0] => F_20110411223434_1.csv
[1] => F_20110411223434_2.csv
[2] => F_20110311223434_1.csv
[3] => F_20110311223434_2.csv
[4] => F_20110311223434_3.csv
[5] => F_20110214143527_1.csv
)
T5500写了那么多的代码 谢谢你的热心 15
xuzuning锦上添花 15
hnxxwyq的代码虽然也可行 但是没有snmr_com的简单 同样感谢 15snmr_com一开始说用array_multisort 我就去搞了一会 没搞出来