【问题标题】:I want to sort file names in array as in windows folder order by name我想按名称对数组中的文件名进行排序,就像在 windows 文件夹中一样
【发布时间】:2017-01-28 02:20:16
【问题描述】:

如何按名称对数组中的文件名进行排序,例如在 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"
}

【问题讨论】:

  • 在排序前尽量不要删除“_”字符
  • 你需要自然排序...func_array_natsort
  • @ComputerPhysicsLab 我测试过,结果不是我需要的;
  • @FrayneKonok我测试了很多次,结果是错误的

标签: php sorting directory filenames


【解决方案1】:

您可以使用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);

【讨论】:

  • 我测试并得到了结果,但不对。array(10) { [0]=> string(11) "php__01.png" [1]=> string(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" }
  • 已修改,我将其作为字符串进行比较(就像您使用 strcmp() 进行的原始操作一样)而不是数字
  • thanks.Computer Physics Lab的代码工作了,需要结果;
  • 对不起。我测试了,发现你的代码也是我nedd的。谢谢你的帮助。
【解决方案2】:

这是解决方案:

<?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 的原因。

输出:

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
)

【讨论】:

    猜你喜欢
    • 2021-04-06
    • 1970-01-01
    • 2012-06-17
    • 2021-08-20
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2011-07-12
    相关资源
    最近更新 更多