2010-12-28 34 views
4

ファイルのリストを検索しようとしていて、配列にいくつかの値が含まれているファイルの作業を実行しようとしています。私は新しいファイル名があるたびに配列をループする必要はないと考えています。PHPで値の配列を持つ検索文字列

$needle = array('blah', 'bleh'); 
foreach($file_list as $file) 
{ 
    foreach($needle as $need) 
     if(strstr($file, $need) !== false) 
      { 
      // do something... 
      } 
} 

ala-
は、私はちょうど、アレイ内の文字列のいずれかがファイル名ではなく、文字列の位置にあるかどうかを知る必要があります。

strstr()と似たようなものを使用したいと思いますが、配列を針として使用することはできません。

i.e.-

if(strstr($haystack, array('blah', 'bleh'))) 
{ 
    // do something... 
} 

私は離れて、正規表現から滞在することを好むだろう、ハンマーの仕事のためのそりのようです。何か案は?

+0

'2を破るを使用;'あなたが最初に出現した http://php.net/manual/en/control-structures.break.php – s3v3n

+0

は実際には「あなたはドン問題です見つけるとき配列全体をループしたい、または配列を針として渡すことができないことを確認しますか? – s3v3n

+0

配列をループしたくないので、配列を 'strstr()'に渡すことができません。 – Patrick

答えて

6

を:

$pattern = '/' . implode('|', array_map('preg_quote', $needle)) . '/i'; 

foreach($file_list as $file) { 
    if(preg_match($pattern, $file)) { 
    // do something 
    } 
} 

リファレンス:preg_quote


ここでは、より創造的な方法です(ただし、内部ループを使用しています非常に可能性が遅くなり、アレイ全体あなた実際にループ数回)など:

function cstrstr($haystack, $needle) { 
    return strstr($haystack, $needle) !== false; 
} 

foreach($file_list as $file) { 
    if(array_sum(array_map('cstrstr', 
         array_pad(array($file), count($needle), $file), 
         $needle))) { 
     // do something 
    } 
} 

しかし、正規表現での利点は明らかである:あなたが「面白い」溶液中でのみに対し一度あなたがパターンを作成する必要があります$fileごとに常に長さcount($needle)の配列を作成する必要があります。

+0

単に 'strstr()'や 'in_array()'を使うことができるのなら正規表現を使うのはなぜですか?アルゴリズムの複雑さが増します。 – s3v3n

+0

@ s3v3n:はい、ループして 'strstr()'を使用して見つけたときに中断することができます。それが別の解決策です。しかし、 'in_array'はファイルの名前が配列に含まれている単語と等しい*の場合にのみ動作します。私は、ファイル名が配列中の単語を含むことができる方法で質問を理解しました... –

+0

実際に私はアイデアを得ました。私は答えとして今投稿します。 – s3v3n

1

パトリック、

in_array()を使用できます。例:

foreach($file_list as $file){ 

    if(in_array($file, $needle)){ 
    //-------------- 
    // Needle found 
    } 
} 

あなたがここでより多くの例を見つけることができます:IMOここに正規表現を使用することで結構ですhttp://php.net/manual/en/function.in-array.php

+0

ファイル名全体を一致させるつもりはありません。 'in_array()'は部分的な文字列も同様に? – Patrick

+0

@パトリック:いいえ、そうではありません。 –

+0

@Patrick、作業しているファイル名の例を教えてください。 in_array()を正しく動作させるために、ファイルに特定の命名規則を適用する方が簡単かもしれません。毎回配列を繰り返し処理しないことを目標にしている場合、in_array()が最善の方法です。 –

0

in_arrayはうまくいくかもしれませんが、ニードル配列に完全一致する必要があります。

あなたは、いくつかのハッシュ文字列の配列をimplode、およびstrstrまたはstrposで結果を使用することができます - strバリアントが最初に出現した、最初のpos位置だけで、非常にユニークな文字列を持っていることを確認してくださいoccurrence-を返します。珍しい接頭辞と接尾辞の両方。これはむしろ迅速かつ汚れたアプローチですが、あなたの状況ではうまくいくかもしれません。

EDIT私は考えていましたが、なぜループを使いたくないのですか?それは、配列からすべての要素を連結するよりはるかに高速です。あなたの質問は、参照配列を使用して部分一致を見つける関数がある場合:ビルドインではないので、独自のループを使用することをお勧めします(または、ループを使用して、それを行ういくつかの関数を実装してください)。

+0

どのようにハッシュ文字列を使用してその作業を行いますか? – Patrick

+0

さて、 'arrray( 'somevalue1'、 'somevalue2')'と 'value1'というファイルがあるとしましょう。 'implode'と' :: 'を使うと' somevalue1 :: somevalue2'となり、 'strpos($ imploded_array、 'value1')'は非FALSEを返します。 – Joost

1

これはループで、すべて自分の名前

// Loop through files 
foreach($files as $file){ 
    foreach($needles as $needle){ 
     // if filename does not contain this needle 
     if(strpos($file, $needle) === false) 
      continue 2; // skip to next file 
    } 
    // this file matches criteria. do smth on this file 
} 
0
if(strstr(implode(" ", $array), $search) { //found } 

内のすべての針を含むファイルしかし、機能上のアクションを実行し、より速く、より少ないメモリを消費している見つけたときに返されます。

関数searchArrayFast($配列、$検索) {(はstrstr($、$検索)){ リターンtrueの場合 {foreachの($ Aと$配列)。 } } falseを返します。 }

0

1つの文字列が別の文字列に含まれているかどうかだけを確認する場合は、preg_match()を使用しないでください。より速くなるのでstrpos()を代わりに使用してください。 http://php.net/manual/en/function.preg-match.php

$needle = array('blah', 'bleh'); 

foreach ($file_list as $file) { 

    $result = $this->searchStrpos($file, $needle); 

     if ($result !== false) { 

      // do something... 
     } 
    } 

/** 
* 
* @param String $string String search 
* @param mixed $needle 
* @param Boolean $onlyFirst return true but 
* @return Boolean Return boolean for search 
*/ 
private function searchStrpos($string, $needle, $onlyFirst = true) { 
    if (is_array($needle)) { 
     foreach ($needle as $item) { 
      $result = strpos($string, $item); 
      if ($result !== false && $onlyFirst) { 
       break; 
      } 
     } 
    } else { 
     $result = strpos($string, $needle); 
    } 

    return $result; 
} 
関連する問題