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;
}