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 に答える