массив opendir исключить файл из результатов

Приведенный ниже код выберет все мои файлы php из указанной папки, а затем перетасует их и выведет 10 результатов на мою страницу, папка содержит файл index.php, который я хотел бы исключить из результатов.

<?php 

if ($handle = opendir('../folder/')) {
    $fileTab = array();
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            $fileTab[] = $file;
        }
    }
    closedir($handle);
    shuffle($fileTab);
    foreach(array_slice($fileTab, 0, 10) as $file) {
        $title = str_replace('-', ' ', pathinfo($file, PATHINFO_FILENAME));
        $thelist .= '<p><a href="../folder/'.$file.'">'.$title.'</a></p>';
    }
}
?>
<?=$thelist?>

Я нашел код для исключения index.php, но я не уверен, как включить его в мой код выше.

<?php
$random = array_values( preg_grep( '/^((?!index.php).)*$/', glob("../folder/*.php") ) );
$answer = $random[mt_rand(0, count($random) -1)];
include ($answer);
?> 

person Daisy Oopsy    schedule 20.01.2013    source источник
comment
Взгляните на glob.   -  person Joseph Silber    schedule 21.01.2013


Ответы (5)


Почему бы просто не изменить строку

if ($file != "." && $file != "..") {

to

if ($file != "." && $file != ".." && $file != 'index.php') {
person shanethehat    schedule 20.01.2013

Подход, основанный на glob() вместо readdir():

<?php 
$files = glob('../folder/*.php');
shuffle($files);
$selection = array_slice($files, 0, 11);

foreach ($selection as $file) {
    $file = basename($file);
    if ($file == 'index.php') continue;

    $title = str_replace('-', ' ', pathinfo($file, PATHINFO_FILENAME));
    // ...
}
person Niko    schedule 20.01.2013
comment
Мне нравится ваш способ использования glob, который я могу использовать для отображения случайных файлов из нескольких папок, например: $files = (glob('../{folder1,folder2,folder3}/*.php', GLOB_BRACE)); не могли бы вы сказать мне, как у вас есть эхо выбранной папки в ссылке $thelist .= '‹p›‹a href=../'.$folder 1 or 2 or3.'/'.$file.'›'. $title.'‹/a›‹/p›'; - person Daisy Oopsy; 21.01.2013

Вы можете использовать

$it = new FilesystemIterator(__DIR__, FilesystemIterator::SKIP_DOTS);
$it = new RegexIterator($it, '/.php$/i', RegexIterator::MATCH);
$exclude = array("index.php");
foreach ( $it as $splFileInfo ) {
    if (in_array($splFileInfo->getBasename(), $exclude))
        continue;

    // Do other stuff
}

Или просто

$files = array_filter(glob(__DIR__ . "/*.php"), function ($v) {
    return false === strpos($v, 'index.php');
});
person Baba    schedule 20.01.2013

вы можете просто изменить эту строку if ($file != "." && $file != "..") { на if ($file != "." && $file != ".." && $file != 'index.php') {

person WhyteWolf    schedule 20.01.2013

Код, который вы нашли, заменяет громоздкий цикл чтения каталога.

А должно быть просто:

 $files = preg_grep('~/index\.php$~', glob("../folder/*.php"), PREG_GREP_INVERT);

Получите 10 элементов, как и раньше:

 $files = array_slice($files, 0, 10);

Затем выведите их.

person mario    schedule 20.01.2013