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。この値がISNで見つからない場合$resultは、の値を取り$startwhile()ループを終了します。それ以外の場合は、インクリメント$startして、ディレクトリ内のすべてのファイルを再度チェックします。

これで、このような非常によく似た関数が、問題なく機能する別のページで実行されます。ただし、これは常に1で停止するようです。

私のアップロードフォルダには間違いなくというファイルがありshowreel1.wmv、これを確実にスキャンします。(scandir配列をエコーし​​ました)ただし、elseブロックに切り替わったようには見え$resultませんが、値「1」が見つからなかったかのように設定を続行します。

関数で使用$sstartしてみましたが、効果はありません。もちろん、これはの値を文字列に変更します。strpos()$start

皆さん、私のためにこれに光を当ててくれませんか?

4

4 に答える 4

1

干し草の山が探している針で始まる場合、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

scandirの代わりに、RecursiveDirectoryIteratorを使用することもできます。をスキップできます。そして..はるかに簡単に、そしてあなたはまたベースパス、サブパスなどを得るでしょう。それはあなたの問題ではありませんが、それはあなたの開発を容易にするかもしれません。

于 2013-03-21T15:01:38.517 に答える
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 に答える