1

我正在使用 readdir 将文件循环到一个数组中并取回这个结果:

Array
(
  [0] => Array
    (
        [name] => /css
        [type] => directory
        [size] => 0
    )

  [1] => Array
    (
        [name] => /index.html
        [type] => file
        [size] => 1208
    )

  [2] => Array
    (
        [name] => /js
        [type] => directory
        [size] => 0
    )
)

我的目标是让它们采用典型的“文件结构格式”,而它首先按类型(目录然后文件)排序,然后按字母顺序排列。

4

2 回答 2

1
function custom_order($a, $b)
{
    $type_cmp = -strcmp($b['type'], $a['type']);

    if ($type_cmp == 0)
    {
        return -strcmp($b['file'], $a['file']);
    }
    else
    {
        return $type_cmp;
    }
}

$test = array
(
  0 => array
    (
        'name' => '/css',
        'type' => 'directory',
        'size' => 0
    ),

  1 => array
    (
        'name' => '/index.html',
        'type' => 'file',
        'size' => 1208
    ),

  2 => array
    (
        'name' => '/js',
        'type' => 'directory',
        'size' => 0
    )
);

// http://www.php.net/manual/en/function.usort.php
usort($test, 'custom_order'); 

var_dump($test);

为了好玩,我做了一个单班轮。(不是以代码清晰的名义推荐的)

function custom_order($a, $b)
{
    return ($type_cmp = -strcmp($b['type'], $a['type'])) === 0 ? -strcmp($b['file'], $a['file']) : $type_cmp;
}
于 2012-08-30T20:42:34.057 回答
0

如果您想变得复杂(考虑到情况,这可能不是必需的 - 我假设每个数组中的条目相对较少(~100)),您应该研究分而治之的排序算法以优化速度(参见例如http://www.ics.uci.edu/~eppstein/161/960118.html或查看维基百科以获得一般概述)。

但是,抛开复杂性不谈,您可以这样做:

function colSort(&$arr, $col, $dir = SORT_ASC) {
   $sort = array();
   foreach ($arr as $k => $r) {
     $sort[$k] = $r[$col];
   }
   array_multisort($sort, $dir, $arr);
 }

然后,您可以使用 egcolSort($array, 'type');按类型排序。该示例还可以进一步修改为按文件大小或文件名排序。

于 2012-08-30T20:43:18.447 回答