所以我所拥有的是一个以降序自然顺序返回的内容目录,我正在使用scandir和natsort,但是添加array_reverse不会产生任何结果。我一直在研究使用opendir和readdir的组合以及其他任何影响这一结果的方法。要排序的项目是编号的图像文件。他们将被退回10 9 8 7等等,但是喜欢从1000- 999- 998-997 ......直到0
这是代码
$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.'" />'}}
}
}
答案 0 :(得分:1)
问题很简单。 array_reverse()
不能通过引用进行修改。您会混淆sort()
ing函数的行为。相反,您只需要使用它生成的返回值。也就是说,有更好的方法。继续阅读...
自PHP5.4起,rsort($array, SORT_NATURAL)
将按DESC顺序对数组进行排序,并将连续数字视为数字而不是字符串。与natsort()
和array_reverse()
相比,这是一种更加直接和简洁的方法。
(Demo)
(Demo with .jpg
extensions)
(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 . '" />';
}
如果您想忽略路径而只返回文件名,只需更改您的 c 当前 w woring d 诱惑。
chdir('dead_dir/dead_content');
$filenames = glob('*.png');
rsort($filenames, SORT_NATURAL);
foreach ($filenames as $filename) {
echo "<div>.png filename => $filename</div>";
}
现在,如果您需要对文件名进行更专业的处理,那么自定义排序功能可能会为您服务。
如以下代码片段所示,太空飞船操作员将自动将变戏法数字字符串键入整数,并给出与上述rsort()
解决方案相同的结果。与使用natsort()
比使用array_reverse()
相比,使用太空飞船操作员仍然更直接。
代码:(Demo)
$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()
内部进行比较时执行必要的操作以去除不需要的字符。
如果有人不熟悉飞船操作员如何进行自定义排序...
$a <=> $b
。$b <=> $a
。答案 1 :(得分:0)
如果您的图片名称采用123-image_name.jpg
,2323-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');
答案 2 :(得分:0)
$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.'" />'}}