Daisy Oopsy
Daisy Oopsy

Reputation: 155

opendir array exclude file from results

The code below will select all of my php files from the named folder and then shuffle them and echo 10 results on my page, the folder contains an index.php file which i would like to be excluded from the results.

<?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?>

I have found a code to exclude index.php but I'm not sure how to incorporate it into my code above.

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

Upvotes: 0

Views: 1841

Answers (7)

Baba
Baba

Reputation: 95131

You can use

$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
}

Or Simply

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

Upvotes: 1

mario
mario

Reputation: 145492

The code you found replaces your cumbersome directory reading loop.

And it should be just:

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

Get 10 elements as before:

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

Then output those.

Upvotes: 0

Niko
Niko

Reputation: 26730

An approach based on glob() instead of 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));
    // ...
}

Upvotes: 1

WhyteWolf
WhyteWolf

Reputation: 456

you could just change this line if ($file != "." && $file != "..") { to if ($file != "." && $file != ".." && $file != 'index.php') {

Upvotes: 0

Tommaso Belluzzo
Tommaso Belluzzo

Reputation: 23685

while (false !== ($file = readdir($handle)))
{
    if ($file != "." && $file != ".." && $file != 'index.php')
        $fileTab[] = $file;
}

Upvotes: 0

clover
clover

Reputation: 5170

You can exclude it while you reading directory content (like you do with '.' and '..'):

if ($handle = opendir('../folder/')) {
    $fileTab = array();
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != ".." && $file != "index.php") {
            $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>';
    }
}
?>

Upvotes: 0

shanethehat
shanethehat

Reputation: 15570

Why not just modify the line

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

to

if ($file != "." && $file != ".." && $file != 'index.php') {

Upvotes: 2

Related Questions