按PHP中的子数组元素值对数组进行排序

时间:2012-08-30 20:28:43

标签: php sorting multidimensional-array

我正在使用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
    )
)

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

如果你想要复杂(根据具体情况可能没有必要 - 我假设你在每个数组中都会有相对较少的条目(~100)),你应该研究一下divide-and.conquer排序算法的速度优化(参见例如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);
 }

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