2011-12-09 9 views
0

に正規表現グループによってソート:私はこの形式のファイル名の配列を持っているPHP

「A - 1.2 - 床Plan.PDF」

私が最初にカテゴリ別に最初の配列をソートする必要があります

1. Category: A 
2. Category: ESC 
3. Category: C 
4. Category: M 
5. Category: E 
6. Category: P 

次に、カテゴリに続く数字で配列を並べ替える必要があります。ここで

をソートする配列の例です:

$arr[0] = "A - 1.0 - Title Page.PDF"; 
$arr[1] = "A - 2.2 - Enlarged Floor Plans"; 
$arr[2] = "A - 2.1.0 - Structural Details.PDF"; 
$arr[3] = "E - 1.0 - Electrical Title Page.PDF"; 
$arr[4] = "A - 1.2 - Floor Plan.PDF"; 
$arr[5] = "P - 1.0 - Plumbing Title Page.PDF"; 
$arr[6] = "A - 2.1.1 - Structural Details.PDF"; 
$arr[7] = "C - 1.0 - Civil Title Page.PDF"; 
$arr[8] = "M - 1.0 - Mechanical Title Page.PDF"; 
$arr[9] = "ESC - 1.0 - Erosion Control Plan.PDF"; 

理想的には、この配列は、その後

$arr[0] = "A - 1.0 - Title Page.PDF"; 
$arr[1] = "A - 1.2 - Floor Plan.PDF"; 
$arr[2] = "A - 2.1.0 - Structural Details.PDF"; 
$arr[3] = "A - 2.1.1 - Structural Details.PDF"; 
$arr[4] = "A - 2.2 - Enlarged Floor Plans"; 
$arr[5] = "ESC - 1.0 - Erosion Control Plan.PDF"; 
$arr[6] = "C - 1.0 - Civil Title Page.PDF"; 
$arr[7] = "M - 1.0 - Mechanical Title Page.PDF"; 
$arr[8] = "E - 1.0 - Electrical Title Page.PDF"; 
$arr[9] = "P - 1.0 - Plumbing Title Page.PDF"; 

になるだろう、私は適切にファイル名をグループ化するための次の正規表現があります

^([A-Z]+?) ?- ?([0-9]+)\.([0-9]+)(\.([0-9]+))?.*$ 

グループ1、グループ2、グループ3の順に並べ替えたいグループ5が存在する場合、グループ5で最後にソートします。グループ4を無視します。

カテゴリを辞書順に並べ替える方が簡単かもしれません。もしそうなら、それは問題ないでしょう。上記の順序でソートされている方が望ましいでしょう。

PHPでこれを行う方法はありますか?

+1

が、これはその順にすべきではありません:あなたはこのような例のためにそれを使用することができます 'A - 1.0、 A-1.2、A-2.1.0、A-2.1.1、A-2.2、C-1.0、E-1.0、ESC-1.0、M-1.0、P- – Krzysztof

+0

@Lolo、そうじゃない?私はあなたのソート版を私と比較しました。私は違いを見つけることができません。 – objectivesea

+0

あなたは:[...]、** ESC、C、M、E **、[...] 私はちょうどなぜだろうと思っていません:[...] ** C、E、ESC、M ** 、[...] – Krzysztof

答えて

4

比較方法を引数とするソート機能があります。

$order = array('A', 'ESC', 'C', 'M', 'E', 'P'); // order of categories 
$order = array_flip($order); // flip order array, it'll look like: ('A'=>0, 'ESC'=>1, ...) 

function cmp($a, $b) 
{ 
    global $order; 

    $ma = array(); 
    $mb = array(); 
    preg_match('/^([A-Z]+?) ?- ?([0-9]+)\.([0-9]+)(?:\.([0-9]+))?.*$/', $a, $ma); 
    preg_match('/^([A-Z]+?) ?- ?([0-9]+)\.([0-9]+)(?:\.([0-9]+))?.*$/', $b, $mb); 

    if ($ma[1] != $mb[1]) { 
     return ($order[$ma[1]] < $order[$mb[1]]) ? -1 : 1; 
    } 
    if ($ma[2] != $mb[2]) { 
     return $ma[2] < $mb[2] ? -1 : 1; 
    } 
    if ($ma[3] != $mb[3]) { 
     return $ma[3] < $mb[3] ? -1 : 1; 
    } 
    // I've changed a regex a little bit, so the last number is 4th group now 
    if (@$ma[4] != @$mb[4]) { 
     return @$ma[4] < @$mb[4] ? -1 : 1; 
    } 
    return 0; 
} 
usort($arr, "cmp"); 
1

方法について:

$arr[0] = "A - 1.0 - Title Page.PDF"; 
$arr[1] = "A - 2.2 - Enlarged Floor Plans"; 
$arr[2] = "A - 2.1.0 - Structural Details.PDF"; 
$arr[3] = "E - 1.0 - Electrical Title Page.PDF"; 
$arr[4] = "A - 1.2 - Floor Plan.PDF"; 
$arr[5] = "P - 1.0 - Plumbing Title Page.PDF"; 
$arr[6] = "A - 2.1.1 - Structural Details.PDF"; 
$arr[7] = "C - 1.0 - Civil Title Page.PDF"; 
$arr[8] = "M - 1.0 - Mechanical Title Page.PDF"; 
$arr[9] = "ESC - 1.0 - Erosion Control Plan.PDF"; 


function cmp($a,$b) { 
    $arr_a = split(' - ', $a); 
    $arr_b = split(' - ', $b); 
    if ($arr_a[0] == $arr_b[0]) 
     return strcmp($arr_a[1], $arr_b[1]); 
    return strcmp($arr_a[0], $arr_b[0]); 
} 

usort($arr, "cmp"); 
print_r($arr); 

出力:

Array 
(
    [0] => A - 1.0 - Title Page.PDF 
    [1] => A - 1.2 - Floor Plan.PDF 
    [2] => A - 2.1.0 - Structural Details.PDF 
    [3] => A - 2.1.1 - Structural Details.PDF 
    [4] => A - 2.2 - Enlarged Floor Plans 
    [5] => C - 1.0 - Civil Title Page.PDF 
    [6] => E - 1.0 - Electrical Title Page.PDF 
    [7] => ESC - 1.0 - Erosion Control Plan.PDF 
    [8] => M - 1.0 - Mechanical Title Page.PDF 
    [9] => P - 1.0 - Plumbing Title Page.PDF 
) 
関連する問題