2010-04-21 138 views
0

有比strpos()循環更好的方法嗎?是否有一個本地php函數來查看一個值的數組是否在另一個數組中?

不是我正在尋找部分匹配而不是in_array()類型的方法。

例如針和乾草堆和期望的回報:

$needles[0] = 'naan bread'; 
$needles[1] = 'cheesestrings'; 
$needles[2] = 'risotto'; 
$needles[3] = 'cake'; 

$haystack[0] = 'bread'; 
$haystack[1] = 'wine'; 
$haystack[2] = 'soup'; 
$haystack[3] = 'cheese'; 

//desired output - but what's the best method of getting this array? 
$matches[0] = 'bread'; 
$matches[1] = 'cheese'; 

即:

magic_function($大海撈針,%$針%)!

+0

[array_intersect](http://www.php.net/manual/en/function.array-intersect.php) – hsz 2010-04-21 18:21:31

+0

不,不會比'bread'針對'烤餅bread'。 OP似乎在尋找通配符匹配功能。 – 2010-04-21 18:22:19

+0

這將適用於非完全匹配嗎? – Haroldo 2010-04-21 18:23:06

回答

2

我想你混淆了你的問題$haystack$needle,因爲烤餅麪包不在草堆,也不是cheesestring。您期望的產量表明您正在尋找乾酪 in 乾酪串。爲此,下面將工作:

function in_array_multi($haystack, $needles) 
{ 
    $matches = array(); 
    $haystack = implode('|', $haystack); 
    foreach($needles as $needle) { 
     if(strpos($haystack, $needle) !== FALSE) { 
      $matches[] = $needle; 
     } 
    } 
    return $matches; 
} 

了給定的草垛和針頭這個執行快兩倍,正則表達式的解決方案。雖然可能會改變不同數量的參數。

3
foreach($haystack as $pattern) { 
    if (preg_grep('/'.$pattern.'/', $needles)) { 
     $matches[] = $pattern; 
    } 
} 
+1

短而甜。 – 2010-04-21 18:24:41

+0

function magic_function($ haystack,$ needles){ // code above above here :) } – hsz 2010-04-21 18:39:42

+0

返回一個包含四個元素的數組:麪包,奶酪,麪包,奶酪 – Gordon 2010-04-21 18:40:55

1

我想你必須自己推出。用戶提供的評論array_intersect()提供了一些替代實現(如this one)。您只需將==替換爲strstr()即可。

1
$data[0] = 'naan bread'; 
$data[1] = 'cheesestrings'; 
$data[2] = 'risotto'; 
$data[3] = 'cake'; 

$search[0] = 'bread'; 
$search[1] = 'wine'; 
$search[2] = 'soup'; 
$search[3] = 'cheese'; 

preg_match_all(
    '~' . implode('|', $search) . '~', 
    implode("\x00", $data), 
    $matches 
); 

print_r($matches[0]); 

// [0] => bread 
// [1] => cheese 

如果你告訴我們更多關於真正問題你會得到更好的答案。

相關問題