php natsort()无法正常工作

时间:2018-08-18 01:13:19

标签: php arrays sorting natsort

我有一个包含500多个jpg的文件夹,分别名为1.jpg,2.jpg,3.jpg,... 205.jpg等。我需要在按数字排序的表格中输出指向它们的链接。

在我natsort()一个文件名数组和print_r之后,它马上就正确地变成了垃圾,但是当我尝试遍历它并在html表中输出时,它就1.jpg 10.jpg 100.jpg 101.jpg 102.jpg 104.jpg 105.jpg 106.jpg 107.jpg 108.jpg等。

这是我的代码:

<?php
$dir = 'files/'; // folder with 500+ images named 1.jpg, 2.jpg, 3.jpg, ... 505.jpg etc.
$files = scandir($dir);

natsort($files);
print_r($files); // here outputs correctly: 'Array ( [0] => . [1] => .. [2] => 1.jpg [106] => 2.jpg [213] => 3.jpg [324] => 4.jpg [432] => 5.jpg [543] => 6.jpg [652] => 7.jpg [699] => 8.jpg...'

$cols = 10;

echo "<table>";
$k = 0;
for ($i = 0; $i < count($files); $i++) {
 if (($files[$i] != ".") && ($files[$i] != "..")) {
  if ($k % $cols == 0) {
   echo "<tr>";
  }
  echo "<td width='70px' align='center'>";
  $path = $dir . $files[$i];
  echo "<a href='$path'>";
  echo "$files[$i]";
  echo "</a>";
  echo "</td>";
  if ((($k + 1) % $cols == 0) || (($i + 1) == count($files))) {
   echo "</tr>";
  }

  $k++;
 }
}
echo "</table>";

1 个答案:

答案 0 :(得分:1)

print_r中您会注意到natsort的结果,键刚刚在$files数组中重新排序,而不是重新编号。因此,当您在$files[$i]上循环时,您将获得与开始时相同的顺序。因此,您有两种选择:使用foreach或使用array_values对键重新编号。这是一个小演示:

$files = array("12.png", "10.png", "2.png", "1.png");
print_r($files);
natsort($files);
print_r($files);  
for ($i = 0; $i < count($files); $i++) {
    echo $files[$i] . "\n";
}
foreach ($files as $file) {
    echo $file . "\n";
}
$files = array_values($files);
for ($i = 0; $i < count($files); $i++) {
    echo $files[$i] . "\n";
}

输出:

Array
(
    [0] => 12.png
    [1] => 10.png
    [2] => 2.png
    [3] => 1.png
)

Array
(
    [3] => 1.png
    [2] => 2.png
    [1] => 10.png
    [0] => 12.png
)

12.png
10.png
2.png
1.png

1.png
2.png
10.png
12.png

1.png
2.png
10.png
12.png