2013-03-21 115 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; 
}