Как отсортировать имя файла в массиве, как в папке 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"}
Вот это решение:
<?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);
?>
Вам нужно заменить «_» на «-«, потому что «-» char стоит на первом месте при заказе чисел.
И вам также нужно дополнить числа начальными нулями, вот почему preg_match и sprintf.
Выход:
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
)
Вы можете создать собственную функцию сортировки, используя usort; в этом случае сортировать по каждому элементу имени файла по очереди
$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);