Sort()返回一个乱序数组

时间:2014-11-21 12:07:53

标签: php

我有一个从函数iterator_to_array填充的数组。在对其进行排序后(尝试asort()ksort()rsort()并且所有这些都显示相同的结果:乱序数组......

这是我的代码。

$fi = new FilesystemIterator($location, FilesystemIterator::SKIP_DOTS);
$file_paths = iterator_to_array( $fi, false);
rsort($file_paths);
echo "<pre>", print_r($file_paths), "</pre>";

print_r返回:

Array
(
[0] => SplFileInfo Object
    (
        [pathName:SplFileInfo:private] => /opt/lampp/htdocs/majo/log_files/teste/log2014324.txt
        [fileName:SplFileInfo:private] => log2014324.txt
    )

[1] => SplFileInfo Object
    (
        [pathName:SplFileInfo:private] => /opt/lampp/htdocs/majo/log_files/teste/log2014325.txt
        [fileName:SplFileInfo:private] => log2014325.txt
    )

[2] => SplFileInfo Object
    (
        [pathName:SplFileInfo:private] => /opt/lampp/htdocs/majo/log_files/teste/log2014323.txt
        [fileName:SplFileInfo:private] => log2014323.txt
    )

[3] => SplFileInfo Object
    (
        [pathName:SplFileInfo:private] => /opt/lampp/htdocs/majo/log_files/teste/log2014322.txt
        [fileName:SplFileInfo:private] => log2014322.txt
    )

)

在清除文件名的例程后,我得到了这个输出:

2014324.txt
2014325.txt
2014323.txt
2014322.txt

但是由于rsort()(当时使用的函数),它应该是:

2014325.txt
2014324.txt
2014323.txt
2014322.txt

每次2014325.txt不合适而我似乎无法将其解决,是否有人知道如何解决这个问题?

我可以实现一个涉及以手动方式进行排序的解决方案,但是会花费更多的时间和资源。

PS:ksort()输出:

2014322.txt
2014323.txt
2014325.txt
2014324.txt

3 个答案:

答案 0 :(得分:2)

您正在排序数组的第一级(没有内容的对象)。数组的第二级(可以说......实际上是对象的内容)包含要排序的值。

您需要创建一个不同的方法,为您正确排序。

答案 1 :(得分:2)

iterator_to_array为您提供了一组对象,但是php并不知道如何比较它们。您必须提取排序键(例如路径)并告诉php按此键排序,例如:

$fi = new FilesystemIterator($location, FilesystemIterator::SKIP_DOTS);
$file_paths = array();
foreach($fi as $f)
    $file_paths[$f->getRealPath()] = $f;
ksort($file_paths);

如果您只需要文件路径且对SplFileInfo提供的其他数据不感兴趣,那么glob可能是一个更简单的选项:

$file_paths = glob("$location/*");

请注意,glob输出已经排序。

答案 2 :(得分:1)

使用usort function

function my_sort_function($a,$b){
   if ($a->{fileName:SplFileInfo:private} == $b->{fileName:SplFileInfo:private}){
      return 0;
   }
   return ($a->{fileName:SplFileInfo:private} > $b->{fileName:SplFileInfo:private})?1:-1;
}
$fi = new FilesystemIterator($location, FilesystemIterator::SKIP_DOTS);
$file_paths = iterator_to_array( $fi, false);
usort($file_paths,'my_sort_function');
echo "<pre>", print_r($file_paths), "</pre>";

我不知道如何访问你的模型的属性,但我希望这有效