2016-09-15 121 views
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 set返回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); 

我用preg_match在這裏,因爲$prefix可以是一個數組,所以數學是:n+ strpos() callsone preg_match() call

和單個項目匹配後,沒有更多的preg_match被稱爲,僅僅迭代結束出。

+1

我不知道正則表達式會比'strpos'更有效率,我不相信整個數組是一個好的解決方案。至少OP的最初想法早在它發現它是有效的時候就返回了。他們並不試圖驗證*每個*項都是有效的,只是數組中的一個* single *項是有效的。 – haliphax

+0

@haliphax正如我所說'有很多方法來羅馬',例如有10000次迭代運行測試,其中創建3個類和2個閉包,並在每次迭代中運行strpos/implode/explode/preg_match函數。該腳本需要1秒。在這種情況下,沒有更有效的方法,因爲工作並不那麼重。在我的例子中,我檢查'!$ valid'來跳過不需要的preg_match調用。 Wahtever,我剛剛把代碼放在這裏給出提示和指示。 – JustOnUnderMillions

+0

@haliphax最後:如果'$ prefix'是一個有10個前綴的數組,數學就是:'10 strpos vs 1 preg_match'你說什麼? – JustOnUnderMillions

相關問題