1

我有一个按自然降序返回的内容目录。

我正在使用scandir()and natsort(),但添加array_reverse()没有结果。

我一直在研究使用组合opendir()以及readdir()其他任何方法来影响这一结果。

要排序的项目是编号的图像文件。它们将被返回为:10 9 8 7等等,但是 like from like 1000 999 998 997... until0

这是我当前的代码:

$dir = 'dead_dir/dead_content/';
$launcher = scandir($dir);
natsort($launcher);
array_reverse($launcher, false);
foreach ($launcher as $value) {
    if (in_array(pathinfo($value, PATHINFO_EXTENSION), array('png'))) {
        echo '<img src="dead_dir/dead_content/'.$value.'" />'
    }
}
4

3 回答 3

1
 $dir='dead_dir/dead_content/';
 $launcher= scandir($dir);
 natsort($launcher);
 $r_launcher = array_reverse($launcher,true);

 foreach($r_launcher as $value ){
   if(in_array(pathinfo($value, PATHINFO_EXTENSION),array('png'))){
       echo '<img src="dead_dir/dead_content/'.$value.'" />'}}
于 2011-09-11T21:36:16.453 回答
1

问题很简单。array_reverse()不通过引用修改。您正在混淆sort()ing 函数的行为。相反,您只需要使用它生成的返回值。也就是说,有更好的方法。继续阅读...

自 PHP5.4 起,rsort($array, SORT_NATURAL)将以 DESC 顺序对数组进行排序,并将连续数字视为数字而不是字符串。这是一种比natsort()ing 然后array_reverse()ing 更直接和简洁的方式技术。

( Demo )
( Demo with .jpgextensions )
( Demo with static string before numbers )

我建议使用glob()扫描您的目录。这样您就可以.png在同一个调用中添加过滤器。

$dir = 'dead_dir/dead_content/';
$filepaths = glob($dir . '*.png');
rsort($filepaths, SORT_NATURAL);
foreach ($filepaths as $filepath) {
    echo '<img src="' . $filepath . '" />';
}

如果您宁愿省略路径而只返回文件名,只需更改您当前工作目录即可

chdir('dead_dir/dead_content');
$filenames = glob('*.png');
rsort($filenames, SORT_NATURAL);
foreach ($filenames as $filename) {
    echo "<div>.png filename => $filename</div>";
}

现在,如果您需要对文件名进行更专业的处理,那么自定义排序功能可能会很好地为您服务。

如以下代码段所示,spaceship 运算符将自动神奇地将 juggle 数字字符串键入为整数,并给出与上述解决方案相同的结果rsort()。使用 spaceship 算子还是比natsort()then更直接array_reverse()

代码:(演示

$filenames = ["10", "1", "100", "1000", "20", "200", "2"];
usort($filenames, function($a, $b) {
    return $b <=> $a;
});

var_export($filenames);

输出:

array (
  0 => '1000',
  1 => '200',
  2 => '100',
  3 => '20',
  4 => '10',
  5 => '2',
  6 => '1',
)

如果您的文件名有前导或尾随非数字字符,您可以在比较usort().

如果有人不熟悉自定义排序如何与宇宙飞船操作员一起工作......

  • 要实现 ASC 顺序,请编写$a <=> $b.
  • 要实现 DESC 命令,请编写$b <=> $a.
于 2020-06-08T07:39:31.677 回答
0

如果您的图像名称采用 , , ... 格式123-image_name.jpg2323-image_name.jpg则可以:

/**
 * Compares digits in image names in the format "123-image_name.jpg"
 *
 * @param string $img1 First image name
 * @param string $img2 Second image name
 * @return integer -1 If first image name digit is greater than second one.
 * 0 If image name digits are equal.
 * 1 If first image name digit is smaller than second one.
 */
function compareImageNames($img1, $img2){
    $ptr = '/^(\d+)-/'; // pattern

    // let's get the number out of the image names
    if (preg_match($ptr, $img1, $m1) && preg_match($ptr, $img2, $m2)) {
        $first  = (int) $m1[0]; // first match integer
        $second = (int) $m2[0]; // second match integer

        // equal don't change places
        if($first === $second) return 0;

        // if move first down if it is lower than second
        return ($first < $second) ? 1 : -1;
    } else{
        // image names didn't have a digit in them
        // move them to front
        return 1;
    }
}

// sort array
usort($images, 'compareImageNames');
于 2011-09-11T08:46:53.017 回答