<?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的大佬能帮忙看看,给点优化建议,谢谢谢谢。。。
###解决方案:使用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);
- 使用
glob()
这个函数的时候,是可以直接指定pattern。那么可以用"*.txt"
这样的方式,来正则筛选 txt 文件 - 将元素加入到数组,我们一般都不使用
array_push
这样的函数操作,都是使用$txtFiles[] = $file
这样的形式。 - 你那个乱序问题,貌似其实不是很重要吧,而且如果要使用乱序,推荐使用
shuffle
函数将数组打乱,然后 foreach 循环挨着输出就行了。
不是很明白你的意图,不过我看着你的代码学习了 glob
这个函数,很感谢!
- 目测问题不少
- 先写成伪代码,然后逐步翻译成真实代码
- 每一步伪代码都可以输出结果,判断是否符合预期