PHP foreach给出错误的结果
我已经搜索了很长一段时间了,但我不明白为什么我的代码不能正常工作。我不确定我是否有阻塞或其他问题,但这里是:PHP foreach给出错误的结果,php,if-statement,foreach,while-loop,Php,If Statement,Foreach,While Loop,我已经搜索了很长一段时间了,但我不明白为什么我的代码不能正常工作。我不确定我是否有阻塞或其他问题,但这里是: $start = 1; $sstart = strval($start); $scan = scandir('upload'); $result = null; while($result==null) { foreach($scan as $value) { if(strpos($value,$start) == fals
$start = 1;
$sstart = strval($start);
$scan = scandir('upload');
$result = null;
while($result==null)
{
foreach($scan as $value)
{
if(strpos($value,$start) == false)
{
$result = $start;
break 2;
}
else
{
$start = $start + 1;
break;
}
}
}
基本上,我想扫描我的目录'upload'
,查找编号在$start
中的任何文件。如果未找到此值,则$result
取$start
的值,然后while()
循环结束。否则,我将递增$start
,并继续再次检查目录中的每个文件
现在,我在另一个页面上运行了一个非常类似的函数,它可以完美地工作。然而,这似乎总是在1停止
我的上传文件夹中肯定有一个名为showreel1.wmv
的文件,它肯定会扫描这个文件。(对scandir阵列进行回音)但是,它似乎从未切换到else
块,而是继续设置$result
,好像从未找到值“1”
我还尝试在strpos()
函数中使用$sstart
,但没有效果,这当然会将$start
的值更改为字符串
你们能帮我解释一下吗?如果干草堆是从你们正在寻找的针开始的,strpos返回0 此行将返回假阳性(即,它将告诉您它不包含字符串,即使它实际上以字符串开头) 您需要使用
==
运算符来精确匹配false
if(strpos($value,$start) === false)
我希望我能理解你想做什么,试试这个:
while($result === null)
{
$found = false;
foreach($scan as $value)
{
if(strpos($value,$start) !== false)
{
$found = true;
$start = $start + 1;
break;
}
}
if(!$found)
{
$result = $start;
break;
}
}
顺便说一下,您应该学习如何使用
===/code>运算符,正确使用strpos()
而不是scandir是非常重要的,您还可以使用。你可以跳过这个选项。和。。更容易的是,您还将获得基本路径、子路径等。虽然这不是您的问题,但它可能会简化您的开发。您总是突破foreach语句,因此只检查目录中的第一个文件。我猜目录中的第一个文件有一个名字和一个数字,否则它将是一个永恒的循环
while($result==null)
{
foreach($scan as $value)
{
if(strpos($value,$start) == false)
{
$result = $start;
break 2; //end the while loop
}
else
{
$start = $start + 1;
break; //end the foreach, but result = null so start with a new foreach
}
}
}
我猜你想找到任何文件中都没有的最低数字。那样的话,我会用
$start = 0; //start with zero because I increase it before the check
$result = null;
while($result==null)
{
$start++;
$found = false;
foreach($scan as $value)
{
if(strpos($value,$start) !== false) {
$found = true;
break; //end the foreach
}
}
if (!$found)
$result = $start;
}
你想要的最终结果是什么?如果(strpos($value,$start)==false),我会得到相同的结果。就好像id在showreel1.wmv中没有看到“1”。每次我通过这个,它是重新上传showreel1.wmv,所以我知道它在那里!那么,showreel1.wmv是文件夹中唯一的文件吗?如果没有,它将在遇到的第一个文件上失败,除非它恰好是列出的第一个文件。不,目录中有一些文件,我打算扫描所有文件,如果其中没有一个包含“1”,它将移动到上载,否则如果它确实找到“1”,它将移动到文件中查找“2”。然后@uby的答案是正确的。你的逻辑是有缺陷的,除非第一个文件包含一个1,否则它每次都会打破循环,而不查看任何其他文件。谢谢你的帮助:)我不得不稍微编辑一下这个,但是的,这很有效。谢谢你,尤比!
$start = 0; //start with zero because I increase it before the check
$result = null;
while($result==null)
{
$start++;
$found = false;
foreach($scan as $value)
{
if(strpos($value,$start) !== false) {
$found = true;
break; //end the foreach
}
}
if (!$found)
$result = $start;
}