比如我一个数组$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

解决方案 »

  1.   

    $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');
    natsort($arr);  //用“自然排序”算法对数组排序
    foreach($arr as $str) echo $str."<br />";
      

  2.   


    这个应该不行,要用multisort
      

  3.   

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

  4.   

    //函数内的临时数组名取得不好,代码太乱,加上点注释
    $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
    */
      

  5.   

    <?php
    $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);
      

  6.   

    本来不想出手的<?php
    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);?>
      

  7.   

    从没用过array_multisort这个函数,手册中看了一下,觉得云里雾里的对数组操作的掌握还停留在非常浅的程度,所以写出来的代码用的往往都是笨办法,高手们看了不要笑啊
      

  8.   

    我不是高手,不敢笑你,只是看着代码那么长,有点犯晕,特别是现在感冒ing
      

  9.   

    虽说#8是正确的,但人家需要写成函数,那为什么不写呢?
    $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
    )
      

  10.   

    感谢各位  snmr_com帮我解决了问题 虽然没给出函数方式  但是我自己已经写成函数了 55
              T5500写了那么多的代码  谢谢你的热心  15
              xuzuning锦上添花                     15
              hnxxwyq的代码虽然也可行 但是没有snmr_com的简单   同样感谢 15snmr_com一开始说用array_multisort 我就去搞了一会 没搞出来