PHP code to exclude index.php using glob

mally picture mally · Sep 5, 2012 · Viewed 8.6k times · Source

Problem

I am trying to display a random page from a file called ../health/ In this file there is a index.php file and 118 other files named php files. I would like to randomly display a file from the health folder but i would like it to exclude the index.php file.

This following code includes the index.php file sometimes. I have also tried altering the $exclude line to show ../health/index.php but still no luck.

<?php
$exclude = array("index.php"); // can add more here later
$answer = array_diff(glob("../health/*.php"),$exclude);
$whatanswer = $answer[mt_rand(0, count($answer) -1)];
include ($whatanswer);
?

Another code i have tried is the following

<?php
$exclude = array("../health/index.php"); // can add more here later
$health = glob("../health/*.php");
foreach ($health as $key => $filename) {
foreach ($exclude as $x) {
if (strstr($filename, $x)) {
unset($whathealth[$key]);
}
}
}
$whathealth = $health[mt_rand(0, count($health) -1)];
include ($whathealth);
?>

This code also includes the index.php file but rather than showing the page it displays the page as an error.

Answer

Ja͢ck picture Ja͢ck · Sep 5, 2012

The first thing that came to mind is array_filter(), actually it was preg_grep(), but that doesn't matter:

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

With preg_grep() using PREG_GREP_INVERT to exclude the pattern:

$health = preg_grep('/index\.php$/', glob('../health/*.php'), PREG_GREP_INVERT);

It avoids having to use a callback though practically it will likely have the same performance

Update

The full code that should work for your particular case:

$health = preg_grep('/index\.php$/', glob('../health/*.php'), PREG_GREP_INVERT);
$whathealth = $health[mt_rand(0, count($health) -1)];
include ($whathealth);