php natsort() 没有按预期工作
php natsort() not working as supposed to
我有一个包含 500 多张 jpg 的文件夹,名为 1.jpg、2.jpg、3.jpg、... 205.jpg 等。我需要输出指向它们的链接table 按数字排序。
在我 natsort()
一个文件名数组和 print_r
之后它立即正确输出,但是当我尝试遍历它并输出 html table 它 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>";
正如您从 natsort
结果的 print_r
中注意到的那样,$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
我有一个包含 500 多张 jpg 的文件夹,名为 1.jpg、2.jpg、3.jpg、... 205.jpg 等。我需要输出指向它们的链接table 按数字排序。
在我 natsort()
一个文件名数组和 print_r
之后它立即正确输出,但是当我尝试遍历它并输出 html table 它 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>";
正如您从 natsort
结果的 print_r
中注意到的那样,$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