PHP foreach给出了错误的结果

时间:2013-03-21 14:49:55

标签: 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) == false)
                {
                    $result = $start;
                    break 2;
                }
            else
                {
                    $start = $start + 1;
                    break;
                }
        }
    }

基本上,我想扫描我的目录'upload',查找$start中保存号码的所有文件。如果未找到此值,则$result将取$start的值,while()循环结束。否则我会增加$start并继续检查目录中的每个文件。

现在我有一个非常类似的功能,在另一个页面上运行,运行完美。然而,这似乎总是停在1。

我的上传文件夹中有一个名为showreel1.wmv的文件,它肯定会对此进行扫描。 (已经回应了scandir数组)然而,它似乎永远不会切换到else块,而是继续设置$result,好像它从未找到值'1'。

我也尝试在$sstart函数中使用strpos()并且它没有效果,这当然会将$start的值更改为字符串。

请问你能为我解释一下吗?

4 个答案:

答案 0 :(得分:1)

如果大海捞针以您正在搜索的针头开始,

strpos返回0

此行将返回误报(即,即使它实际上以字符串开头,它也会告诉您它不包含字符串)

if(strpos($value,$start) == false)

您需要使用===运算符来匹配错误的

 if(strpos($value,$start) === false)

答案 1 :(得分:1)

我希望我理解你要做的事情,试试这个:

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

顺便说一下,您应该学习如何使用===运算符,正确使用strpos()

是必不可少的

答案 2 :(得分:0)

您也可以使用RecursiveDirectoryIterator代替scandir。你可以跳过。而且......更容易,你也会得到基道,子路径等。虽然这不是你的问题,但它可能会减轻你的发展。

答案 3 :(得分:0)

您总是打破foreach语句,因此您只检查目录中的第一个文件。我想目录中的firstfile有一个带有数字的名字,否则它将是一个永恒的循环。

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