0

我已经搜索了很长时间,但我无法弄清楚为什么我的代码无法正常工作。我不确定我是否遇到障碍或其他任何事情,但这里是:

$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取 的值$startwhile()结束循环。否则,我会增加$start并继续检查目录中的每个文件。

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

在我的上传文件夹中肯定有一个文件showreel1.wmv,它肯定会扫描它。(已经回显了scandir数组)但是,它似乎从未切换到else块,而是继续设置$result,就好像它从未找到值'1'。

我也尝试过$sstartstrpos()函数中使用,它没有任何效果,这当然会将值更改$start为字符串。

你们能帮我解释一下吗?

4

4 回答 4

1

如果 haystack 以您正在搜索的针头开始,则 strpos 返回 0

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

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

您需要使用===运算符来完全匹配 false

 if(strpos($value,$start) === false)
于 2013-03-21T14:56:04.270 回答
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()

于 2013-03-21T14:58:07.753 回答
0

您总是跳出 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;
}
于 2013-03-21T15:18:53.543 回答
0

除了 scandir,您还可以使用RecursiveDirectoryIterator。您可以跳过 . 和 .. 更容易,您还将获得基本路径、子路径等。虽然这不是您的问题,但它可能会简化您的开发。

于 2013-03-21T15:01:38.517 回答