【问题标题】:How to sort this array by type (dir first and then files)如何按类型对该数组进行排序(首先是目录,然后是文件)
【发布时间】:2012-07-20 01:08:24
【问题描述】:

我想知道如何像这样对数组进行排序:

$array[] = Array (
    'name' => '/home/gtsvetan/public_html/presta/cms.php'
    'type' => 'text/x-php'
    'size' => 1128
    'lastmod'  => 1339984800
);
$array[] = Array (
    'name' => '/home/gtsvetan/public_html/presta/docs/'
    'type' => 'dir'
    'size' => 0
    'lastmod' => 1329253246
);

我想先按类型(首先是文件夹,然后是文件)排序,然后按字母顺序排序。但我不知道如何排序。

最好的问候, 乔治!

【问题讨论】:

    标签: php arrays sorting file-type alphabetical


    【解决方案1】:

    你可以使用usort()

    在比较功能中,您对名称和类型进行两次比较 - 如下所示:

    function compare_f($a,$b) {
    
     if($a['type']=='dir'&&$b['type']!='dir') return 1;
     if($a['type']!='dir'&&$b['type']=='dir') return -1;
     if(substr($a['name'],-1,1)=='/') $a['name']=substr($a['name'],0,-1);
     if(substr($b['name'],-1,1)=='/') $b['name']=substr($b['name'],0,-1);
     $af_array=explode('/',$a['name']);
     $a_name=$af_array[count($af_array)-1];
     $bf_array=explode('/',$b['name']);
     $b_name=$bf_array[count($bf_array)-1];
    
     if($a_name>$b_name) 
        return 1;
      return -1;
    
    }
    
    usort($array,'compare_f');
    

    【讨论】:

    • 为了让我正常工作,它必须是这样的:if($a['type']=='dir' && $b['type']!='dir') return -1; if($a['type']!='dir' && $b['type']=='dir') return 1; 但是谢谢,因为我可以看到这个函数的一个很好的解释!
    • 这只会首先显示目录。以后的结果不会按字母顺序排列
    • 目前我对其进行测试,它首先显示 dirs,然后文件也按字母顺序显示...
    【解决方案2】:

    你可以做这样的事情..

    $dir = array();
    $file = array();
    
    $dir = array();
    $file = array();
    
    foreach($array as $b=>$v) {
    if($v['type'] == "dir") {
        $dir[] = $v;
    } else {
        $file[] = $v;
    }
    }
    
    $combined = array_merge($dir, $file);
    

    随意调整。

    【讨论】:

    • 排序发生在哪里?
    猜你喜欢
    • 2017-05-11
    • 2023-04-06
    • 2013-02-10
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多