2016-09-15 4 views
1

私はそれらの少なくとも1つが指定された文字列で始まるされているかどうか、配列のすべての要素をチェックして、知りたい:配列のすべての要素を効率的にチェックする方法(strpos(...))

public function validateStringByPrefix(string $string, $prefix) 
{ 
    $valid = false; 
    if (is_string($prefix)) { 
     if (strpos($string, $prefix) === 0) { 
      $valid = true; 
     } 
    } elseif (is_array($prefix)) { 
     foreach ($prefix as $partPrefix) { 
      if (strpos($string, $partPrefix) === 0) { 
       $valid = true; 
       break; 
      } 
     } 
    } 
    return $valid; 
} 

は、それが可能に/どのように同じ、より効率的な方法を達成することです?

(それは安い方法だが、それは自分のアプリケーションに多くの時間を呼ばれていますので、でも最低限の改善が明らかにアプリケーションのパフォーマンスを向上させるかもしれません。)

+1

サンプルデータを提供すると便利です –

+0

大きな改善はありませんが、$ validをtrueに設定してループを終了する代わりに、trueを返し、返す代わりに$ validを返します。戻り値falseの場合 – b0ne

+1

本当に文字列の開始点にあり、 'substr($ str、0、$ len)=== $ prefix'を使うだけですか?文字列が接頭辞と比べて長い場合は、より速くする必要がありますか?いつも通り - ベンチマークで確認する –

答えて

1

あなたが次の解決しようとすることができます

public function validateStringByPrefix(string $string, $prefix) 
{ 
    return (bool)array_filter((array)$prefix, function($prefix) use ($string) { 
     return strpos($string, $prefix)===0; 
    }); 
} 

PSあなたは(接頭辞付き)少数の大規模な配列を持っている場合は、私の解決策は、あまり効率的であり、あなたは、このように私たちのアプローチを組み合わせることができます。

public function validateStringByPrefix(string $string, $prefix) 
{ 
    if($string=='') { 
     return false; 
    } 
    foreach ((array)$prefix AS $subprefix) { 
     if (strpos($string, $subprefix)===0) { 
      return true; 
     } 
    } 
    return false; 
} 
+2

を使って調べて欲しいと思いますより効率的:ここでは、一致が見つかると直ちにOPのソリューションが返すすべての値を評価します。 – jeroen

+0

私は私の答えを編集しました。 –

-1

ローマに多くの方法がありますが....

//your array to test for 
$array=[]; 
//set valid to false 
$valid=false; 
//setup prefixes array or not 
$prefix='whatever'; 
//make array if you dont have one 
!is_array($prefix) AND $prefix=array($prefix); 
//prepare for use as REGEX 
$prefix=implode('|',$prefix); 
//do the work 
array_walk($array,function($val,$key) use(&$valid,$prefix){ 
     if (!$valid && preg_match("#^($prefix)#",$key)) { 
      $valid = true; 
     } 
}); 
var_export($valid); 

$prefixは配列にすることができますので、私は、ここにpreg_matchを使用するので、数学は次のようになります。n+ strpos() callsone preg_match() call

そして単一の項目が一致した後、preg_matchが呼び出されていないもう、終わりにだけ反復し、でる。

+1

正規表現が 'strpos'よりも効率的になることはわかりません。配列全体を歩くのは良い解決策だとは思いません。少なくともOPの初期の考えは、それが有効であることを発見したときに早く戻った。 *すべての項目が有効であることを検証しようとしているわけではなく、配列内の*単一の項目が有効であるだけです。 – haliphax

+0

@haliphax私は 'romeにはたくさんの方法がある 'と言うように、例えば、3回のクラスと2回のクロージャが作成され、strpos/implode/explode/preg_match関数が各反復で実行される10000回の反復でテストを実行します。スクリプトは1秒かかります。この場合、作業はそれほど重くはないので、実際には効率的な方法はありません。私の例では、 '!$ valid'をチェックして、必要なpreg_match呼び出しをスキップします。 Wahtever、ヒントや指示を出すためにコードをここにドロップしました。 – JustOnUnderMillions

+0

@haliphaxそして最後に、 '$ prefix'が10個の接頭辞を持つ配列であれば、' 10 strpos vs 1 preg_match'とは何ですか? – JustOnUnderMillions

関連する問題