вывод массива циклов, странное поведение, php

avatar
undefined variable
8 апреля 2018 в 10:13
78
1
-1

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

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);
?>
Источник
u_mulder
8 апреля 2018 в 10:16
0

Вы понимаете, что сортируете массив на каждой итерации while?

Ultimater
8 апреля 2018 в 10:17
0

Нет смысла пытаться сортировать без достаточного количества результатов для сортировки с самого начала. Вместо этого сохраните имена файлов каталогов в массиве. Когда он закончится, отсортируйте этот массив один раз. Затем, наконец, прокрутите его и повторите ваши красивые HTML-ссылки.

Ответы (1)

avatar
u_mulder
8 апреля 2018 в 10:18
2

Вам нужно сделать следующее:

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

// 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 />";
}
undefined variable
8 апреля 2018 в 11:06
0

Я использую переменную для ссылки <a href=/myfolder/$filename, и, похоже, она не выводится таким образом.

u_mulder
8 апреля 2018 в 11:37
0

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

undefined variable
8 апреля 2018 в 21:31
0

обновление кода, в основном у меня есть 2 $vars, один для ссылки и один для отображения.