эхо выходной массив, странное поведение, переполнение стека

Я использую этот код, который я нашел в сети для вывода ссылок.

https://2buntu.com/articles/1301/php-script-to-dynamically-generate-links-to-the-files-present-in-current-directory/

    <?php
$dir_open = opendir('.');

while(false !== ($filename = readdir($dir_open))){
if($filename != "." && $filename != ".."){
$link = "<a href='./$filename'> $filename </a><br />";
echo $link;
}
}

closedir($dir_open);
?>

Теперь я хотел бы сортировать по алфавиту, поэтому я помещаю в массив сортировку и вывод. Однако я получаю несколько странный повторяющийся вывод, в 100 раз больше результатов, чем должно быть. что происходит здесь?

<?php
$dir_open = opendir('./myfolder/');

while(false !== ($filename = readdir($dir_open))){
if($filename != "." && $filename != ".."){
$array[] = "<a href='./myfolder/'> $filename </a><br />";
sort($array, SORT_NATURAL);
foreach ($array as $key => $val) {
echo $val;
}
}
}

closedir($dir_open);
?>

полный код

<?php
$dir_open = opendir('./suburblist/');

while(false !== ($filename = readdir($dir_open))){

if($filename != "." && $filename != ".." && $filename != (preg_match('/\.html$/i', $filename))) {

$domfilename = preg_replace('/\\.[^.\\s]{3,4}$/', '', $filename);
$domfilename = str_replace("-", " ", "$domfilename");
$domfilename = ucwords("$domfilename");
$array[] = $domfilename;
}
}

sort($array, SORT_NATURAL);

foreach ($array as $val) {

echo "<a href='/suburblist/$filename'>$val </a>";
}

closedir($dir_open);
?>

-1

Решение

Что вам нужно сделать, это:

  • получить все имена файлов в массиве
  • сортировать массив один раз
  • выходной отсортированный массив один раз

// get all filenames in array
while (false !== ($filename = readdir($dir_open))){
if($filename != "." && $filename != ".."){
$array[] = $filename;
}
}

// sort array
sort($array, SORT_NATURAL);

// output values from array
foreach ($array as $val) {
echo "<a href='./myfolder/'> $val </a><br />";
}

Обновление двух переменных:

// get all filenames in array
while (false !== ($filename = readdir($dir_open))){
if($filename != "." && $filename != ".."){
$array[] = ['name' => $filename, 'link' => 'another value'];
}
}

// sort array with custom function, as your array is multidimensional now:
usort(
$array,
function ($a, $b) { return strnatcmp($a['name'], $b['name']); }
);

// output values from array
foreach ($array as $val) {
echo "<a href='./myfolder/" . $val['link'] . "'>" . $val['name'] . "</a><br />";
}
2

Другие решения

Других решений пока нет …