PHP-код для исключения index.php с помощью glob

проблема

Я пытаюсь отобразить случайную страницу из файла с именем ./health/. В этом файле есть файл index.php и 118 других файлов с именами php-файлов. Я хотел бы случайно отобразить файл из папки работоспособности, но я бы хотел, чтобы он исключил файл index.php.

Этот следующий код иногда включает файл index.php. Я также попытался изменить строку $ exclude, чтобы показать ../health/index.php, но все равно не повезло.

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

Другой код, который я пробовал, следующий

 <?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); ?> с <?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); ?> 

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

Первое, что пришло в голову, это array_filter() , на самом деле это было preg_grep() , но это не имеет значения:

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

С помощью preg_grep() с помощью PREG_GREP_INVERT чтобы исключить шаблон:

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

Он избегает использования обратного вызова, хотя практически он, вероятно, будет иметь одинаковую производительность

Обновить

Полный код, который должен работать для вашего конкретного случая:

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

Чтобы ответить на ответ Джека, с помощью preg_grep() вы также можете:

 $files = array_values( preg_grep( '/^((?!index.php).)*$/', glob("*.php") ) ); 

Это вернет массив со всеми файлами, которые НЕ соответствуют index.php напрямую. Так вы можете инвертировать поиск index.php без флага PREG_GREP_INVERT .