php中的sort()是如何排列目录结构数组的?
How does sort() in php arranges directory structure array?
我正在从官方手册中学习 php,并且刚开始学习数组部分的示例 #13 https://www.php.net/manual/en/language.types.array.php 当我 运行 本地 windows 中的示例代码时10 使用命令行中的 php localserver 我观察到 sort()
实际上对数组进行了排序。我尝试了以下代码:
<?php
// fill an array with all items from a directory
$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
$files[] = $file;
}
print_r($files);
sort($files);
print_r($files);
closedir($handle);
?>
我得到的输出如下:
Array
(
[0] => .
[1] => ..
[2] => .ftpquota
[3] => Ftp fxg710ehhrpx.xml
[4] => index.html
[5] => index.php
[6] => Logo
[7] => myphp
[8] => OnlineSlap.rar
)
Array
(
[0] => .
[1] => ..
[2] => .ftpquota
[3] => Ftp fxg710ehhrpx.xml
[4] => Logo
[5] => OnlineSlap.rar
[6] => index.html
[7] => index.php
[8] => myphp
)
如您所见,在使用 sort
之前,数组是按字母顺序排列的运行,但在 sort()
之后,顺序变成了 运行dom。
为什么数组得到 unsorted
排序的预期行为是什么?
谢谢。
您的数组正在按区分大小写的顺序进行排序(sort
), so entries starting with A-Z
come before those starting with a-z
. If you want to retain a case-insensitive order, you can call sort
的默认顺序与 SORT_FLAG_CASE
标志结合 SORT_STRING
以实现此目的:
sort($files, SORT_FLAG_CASE | SORT_STRING);
print_r($files);
输出
Array
(
[0] => .
[1] => ..
[2] => .ftpquota
[3] => Ftpfxg710ehhrpx.xml
[4] => index.html
[5] => index.php
[6] => Logo
[7] => myphp
[8] => OnlineSlap.rar
)
请注意,根据您对 Test2.jpg
和 Test10.jpg
等文件名进行排序的要求,您可能需要使用 natcasesort
,因为它也会按数字排序。例如,
$files = array (
0 => 'test2.jpg',
1 => 'Test10.jpg'
);
shuffle($files);
sort($files, SORT_FLAG_CASE | SORT_STRING);
print_r($files);
natcasesort($files);
print_r($files);
输出:
Array
(
[0] => Test10.jpg
[1] => test2.jpg
)
Array
(
[1] => test2.jpg
[0] => Test10.jpg
)
我正在从官方手册中学习 php,并且刚开始学习数组部分的示例 #13 https://www.php.net/manual/en/language.types.array.php 当我 运行 本地 windows 中的示例代码时10 使用命令行中的 php localserver 我观察到 sort()
实际上对数组进行了排序。我尝试了以下代码:
<?php
// fill an array with all items from a directory
$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
$files[] = $file;
}
print_r($files);
sort($files);
print_r($files);
closedir($handle);
?>
我得到的输出如下:
Array
(
[0] => .
[1] => ..
[2] => .ftpquota
[3] => Ftp fxg710ehhrpx.xml
[4] => index.html
[5] => index.php
[6] => Logo
[7] => myphp
[8] => OnlineSlap.rar
)
Array
(
[0] => .
[1] => ..
[2] => .ftpquota
[3] => Ftp fxg710ehhrpx.xml
[4] => Logo
[5] => OnlineSlap.rar
[6] => index.html
[7] => index.php
[8] => myphp
)
如您所见,在使用 sort
之前,数组是按字母顺序排列的运行,但在 sort()
之后,顺序变成了 运行dom。
为什么数组得到 unsorted
排序的预期行为是什么?
谢谢。
您的数组正在按区分大小写的顺序进行排序(sort
), so entries starting with A-Z
come before those starting with a-z
. If you want to retain a case-insensitive order, you can call sort
的默认顺序与 SORT_FLAG_CASE
标志结合 SORT_STRING
以实现此目的:
sort($files, SORT_FLAG_CASE | SORT_STRING);
print_r($files);
输出
Array
(
[0] => .
[1] => ..
[2] => .ftpquota
[3] => Ftpfxg710ehhrpx.xml
[4] => index.html
[5] => index.php
[6] => Logo
[7] => myphp
[8] => OnlineSlap.rar
)
请注意,根据您对 Test2.jpg
和 Test10.jpg
等文件名进行排序的要求,您可能需要使用 natcasesort
,因为它也会按数字排序。例如,
$files = array (
0 => 'test2.jpg',
1 => 'Test10.jpg'
);
shuffle($files);
sort($files, SORT_FLAG_CASE | SORT_STRING);
print_r($files);
natcasesort($files);
print_r($files);
输出:
Array
(
[0] => Test10.jpg
[1] => test2.jpg
)
Array
(
[1] => test2.jpg
[0] => Test10.jpg
)