PHP遍历当前路径下txt文件,随机输出且不重复,直到全部输出完再重新循环,请问这样写是正确的吗?

<?php
$files=[];
if(count($files)==0) {
    foreach(glob("./*") as $d) {
        $tmp=explode('.',$d);
        $k=end($tmp);
        if(is_file($d)&&strcasecmp($k,"txt")==0) {
            array_push($files,$d);
        }
    }
}
$index=array_rand($files,1);
$source=$files[$index];
unset($files[$index]);
header('Location: '.$source);

?>

不是很懂PHP的小白,希望会PHP的大佬能帮忙看看,给点优化建议,谢谢谢谢。。。

阅读 4.1k
3 个回答

解决方案:使用Session先记录所有文件,遍历完成移除,即可每次遍历不重复,Cookies也行,很简单。

<?php
ini_set('session.gc_maxlifetime', 600);
session_start();
$files = [];
if (!empty($_SESSION['mytxts'])) {
    $files = $_SESSION['mytxts'];
} else {
    foreach (glob("./*") as $file) {
        $tmp = explode('.', $file);
        $ext = end($tmp);
        if (is_file($file) && strcasecmp($ext, "txt") == 0) {
            $files[] = $file;
        }
    }
    $_SESSION['mytxts'] = $files;
}
$index = array_rand($files, 1);
$source = $files[$index];
unset($files[$index]);
$_SESSION['mytxts'] = $files;
echo $source;
var_dump($_SESSION['mytxts']);
?>
<?php

$txtFiles = [];
foreach (glob("*.txt") as $file) {
    $txtFiles[] = $file;
}

var_dump($txtFiles);
  1. 使用 glob() 这个函数的时候,是可以直接指定pattern。那么可以用 "*.txt" 这样的方式,来正则筛选 txt 文件
  2. 将元素加入到数组,我们一般都不使用 array_push 这样的函数操作,都是使用 $txtFiles[] = $file 这样的形式。
  3. 你那个乱序问题,貌似其实不是很重要吧,而且如果要使用乱序,推荐使用 shuffle 函数将数组打乱,然后 foreach 循环挨着输出就行了。

不是很明白你的意图,不过我看着你的代码学习了 glob 这个函数,很感谢!

  1. 目测问题不少
  2. 先写成伪代码,然后逐步翻译成真实代码
  3. 每一步伪代码都可以输出结果,判断是否符合预期
推荐问题