2011-12-21 47 views
6

我有一個函數需要一個字符串(乾草堆)和一串字符串(針),並且如果至少有一根針是乾草堆的子字符串,則返回true。編寫它並不需要太多時間或精力,但是我想知道是否有一個PHP函數已經這樣做了。在乾草堆裏發現針,其中針是針陣列

function strstr_array_needle($haystack, $arrayNeedles){ 
    foreach($arrayNeedles as $needle){ 
     if(strstr($haystack, $needle)) return true; 
    } 
    return false;  
} 
+3

變化'的strstr($大海撈針,$針)''來strpos($大海撈針,$針)== FALSE' ... – 2011-12-21 21:49:51

回答

9

只是一個建議...

function array_strpos($haystack, $needles) 
{ 
    foreach($needles as $needle) 
     if(strpos($haystack, $needle) !== false) return true; 
    return false; 
} 
+0

感謝您的回答,使用strpos而不是strstr的任何特定原因? – Drahcir 2011-12-22 01:50:22

+1

@RichardLivingston,你好,你應該,因爲strstr返回字符串的一部分(這種行爲與PHP5.3不同),而strpos返回位置(如果找到)或假(如果找不到),所以這可能會更快。從文件'如果你只想確定一個特定針是否發生在乾草堆裏,使用更快,更少的內存密集函數strpos()來代替。「。乾杯。 – 2011-12-22 02:37:00

1

我認爲最接近的功能將是array_walk_recursive(),但是這需要一個回調。所以使用它可能會比你現有的更復雜。

0

我不完全確定你想要做什麼,但我認爲in_array()可以幫助你做你正在尋找的東西。

$needleArray = array(1, 2, 3); // the values we want to get from 
$outputArray = array(...); // the values to search for 

foreach ($outputArray as $value) { 
    if (in_array($value, $needleArray)) { 
     // do what you want to do...the $value exists in $needleArray 
    } 
} 
+1

'in_array'只支持相等比較('=='和'===')。 Richard的函數使用子串比較。 – outis 2011-12-26 07:07:54

0

如果你只是試圖確定乾草堆中存在哪些針,我建議array_intersect函數。從PHP.net網站

<?php 
$array1 = array("a" => "green", "red", "blue"); 
$array2 = array("b" => "green", "yellow", "red"); 
$result = array_intersect($array1, $array2); 
print_r($result); 
?> 

The above example will output: 
Array 
(
    [a] => green 
    [0] => red 
) 

基本上

文檔,這將導致在陣列中,顯示出現在兩個陣列的所有值。在你的情況下,如果找到任何針,你的代碼將返回true。下面的代碼將使用array_intersect函數執行此操作,但如果這比查爾斯答案更簡單,那麼這個問題是有爭議的。

if(sizeof(array_intersect($hackstack, $arrayNeedles)) > 0) 
    return true; 
else 
    return false; 

再次,我不確定你的代碼試圖做什麼,除了如果任何針存在返回true。如果您可以提供一些您想要達到的內容,可能會有更好的方法。

希望這會有所幫助。

0

沒有一個函數的行爲如strstr_array_needle(該名稱具有誤導性;我期望它返回的子字符串爲$haystack)。還有其他功能可以用來代替循環,但它們沒有優點,需要更多時間。例如:

# iterates over entire array, though stops checking once a match is found 
array_reduce($needles, 
    function($found, $needle) use ($haystack) { 
     return $found || (strpos($haystack, $needle) !== false); 
    }, 
    false); 

# iterates over entire array and checks each needle, even if one is already found 
(bool)array_filter($needles, 
    function($needle) use ($haystack) { 
     return strpos($haystack, $needle) !== false; 
    }); 
0

這裏是一個測試和工作職能:

<?php 
function strpos_array($haystack, $needles, $offset = 0) { 
    if (is_array($needles)) { 
     foreach ($needles as $needle) { 
      $pos = strpos_array($haystack, $needle); 
      if ($pos !== false) { 
       return $pos; 
      } 
     } 
     return false; 
    } else { 
     return strpos($haystack, $needles, $offset); 
    } 
}