2013-03-21 87 views
0

我已经搜索了很长一段时间,现在我找不到为什么我的代码不工作它是如何出现的。我不知道如果我有一个块或任何东西,但这里有云:PHP foreach给出错误的结果

$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的值更改为一个字符串。

你们可以帮我解释一下吗?如果草堆与你正在寻找

这条线将返回一个假阳性针开始

+1

你想要的最终结果是什么? – Galen 2013-03-21 14:52:45

+0

if(strpos($ value,$ start)=== false) – 2013-03-21 14:55:41

回答

1

我希望我理解你想要什么d O,尝试这样的:

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()

+0

我不得不稍微编辑一下,但是这个工作。谢谢Uby! – user2195574 2013-03-21 15:31:44

1

strpos返回0(即,它会告诉你,它不包含字符串即使真正开始它与字符串)

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

您需要使用===操作精确匹配假

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

我得到相同的结果。就好像id在showreel1.wmv中看不到'1'。 每当我经历这个,它重新上传showreel1.wmv,所以我知道它在那里! – user2195574 2013-03-21 15:01:35

+0

好,是showreel1.wmv文件夹中的唯一文件?如果没有,它会在遇到的第一个文件上失败,除非它恰好是列出的第一个文件。 – Crisp 2013-03-21 15:08:26

+0

没有目录中有几个文件,我打算扫描所有这些文件,如果它们都没有包含'1',那么它移动到上传,否则,如果它找到'1',则它移动到寻找'2 '在文件中。 – user2195574 2013-03-21 15:10:47

0

相反SCANDIR的,你也可以使用RecursiveDirectoryIterator。你可以跳过。和..更容易,你也会得到基路径,子路径等。虽然这不是你的问题,但它可能会缓解你的发展。

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