2016-09-20 10 views
1

Windowsフォルダのように、ファイル名を並べ替えるにはどうすればいいですか?Windowsフォルダのようにファイル名を並べ替える場合

$arr = array('php__01.png','php__02.png','php__03.png','php_2_01.png','php_2_02.png','php_10_01.png','php_10_02.png','php_9_02.png','php_9_01.png','php_9_03.png'); 

<?php 
$arr = array('php__01.png','php__02.png','php__03.png','php_2_01.png','php_2_02.png','php_10_01.png','php_10_02.png','php_9_02.png','php_9_01.png','php_9_03.png'); 
function cmp($a, $b) { 
    $a_temp = str_replace('_', '', $a); 
    $b_temp = str_replace('_', '', $b);  
    return strcmp($a_temp,$b_temp); 
} 
usort($arr, "cmp"); 
?> 

このような輸出::コードと配列は、ちょうどこのようなものです

array(10) { 
[0]=> 
string(11) "php__01.png" 
[1]=> 
string(11) "php__02.png" 
[2]=> 
string(11) "php__03.png" 
[3]=> 
string(13) "php_10_01.png" 
[4]=> 
string(13) "php_10_02.png" 
[5]=> 
string(12) "php_2_01.png" 
[6]=> 
string(12) "php_2_02.png" 
[7]=> 
string(12) "php_9_01.png" 
[8]=> 
string(12) "php_9_02.png" 
[9]=> 
string(12) "php_9_03.png" 
} 

と私はそのようにソートしたい:

array(10) { 
[0]=> 
string(10) "py__01.png" 
[1]=> 
string(10) "py__02.png" 
[2]=> 
string(10) "py__03.png" 
[3]=> 
string(11) "py_2_01.png" 
[4]=> 
string(11) "py_2_02.png" 
[5]=> 
string(11) "py_9_01.png" 
[6]=> 
string(11) "py_9_02.png" 
[7]=> 
string(11) "py_9_03.png" 
[8]=> 
string(12) "py_10_01.png" 
[9]=> 
string(12) "py_10_02.png" 
} 
+0

文字 "_" を削除してみません –

+0

をsortening前に、あなたが自然順序付けを必要とする... [func_array_natsort](http://www.w3schools.com/php/func_array_natsort.asp) –

+0

@ComputerPhysicsLab私はテストした結果は私の必要性ではありません。 – owl

答えて

1

ここでは、ソリューションです:

<?php 
$arr = array('php__01.png','php__02.png','php__03.png','php_2_01.png','php_2_02.png','php_10_01.png','php_10_02.png','php_9_02.png','php_9_01.png','php_9_03.png'); 
function reduce($a) { 
    $a = str_replace('_', '-', $a); 
    $a = preg_replace('#([0-9]+)#e', 'sprintf("%02d", "\\1")', $a); 

    return $a; 
} 
function cmp($a, $b) { 
    $a_temp = reduce($a); 
    $b_temp = reduce($b); 

    return strcmp($a_temp,$b_temp); 
} 
usort($arr, "cmp"); 
print_r($arr); 
?> 

http://ideone.com/Yt6jpQ

あなたがで「_」交換する必要があります「 - 」数字を発注するときには " - "が最初に来るからです。

また、preg_matchとsprintfの理由のために、先頭に0を付ける必要があります。

出力:

Array 
(
    [0] => php__01.png 
    [1] => php__02.png 
    [2] => php__03.png 
    [3] => php_2_01.png 
    [4] => php_2_02.png 
    [5] => php_9_01.png 
    [6] => php_9_02.png 
    [7] => php_9_03.png 
    [8] => php_10_01.png 
    [9] => php_10_02.png 
) 
+1

それは働きます。ありがとうございます。 – owl

+0

あなたは私の答えを得てもらえますか?どうも! –

1

することができますを使用してカスタムソート関数を作成します。この場合は、順番に、ファイル名の各要素によってソートする

$cb = function($valueA, $valueB) { 
    $vA = explode('_', $valueA); 
    $vB = explode('_', $valueB); 
    $element = 0; 
    do { 
     $x = (int) $vA[$element] - (int) $vB[$element++]; 
    } while ($x == 0); 
    return $x; 
}; 

usort($arr, $cb); 
+0

私はテストして結果を得ましたが、right.array(10){ [0] => string "php__01.png" [1] => ストリング(11) "php__02.png" [2] => ストリング(11) "php__03.png" [3] => ストリング(13) "php_10_01.png" [4] => ストリング(13) "php_10_02.png" [5] => ストリング(12) "php_2_01.png" [6] => ストリング(12) "php_2_02.png" [7] => ストリング(12) "php_9_01.png" [8] => ストリング(12) "php_9_02.png" [9] => ストリング(12) "php_9_03.png" } – owl

+0

私はなく数値 –

+0

(元の使用のstrcmp()のような)文字列として比較し、変更されました感謝.Computer Physics Labのコードが動作し、結果が必要です。 – owl

関連する問題