2011-07-19 31 views
2

我想要搜索整個字符串還是字符串的一部分是否是數組的一部分。這在PHP中如何實現?如何搜索數組中的一部分字符串?

另外,我怎樣才能在其中使用metaphone

例子:

array1={'India','USA','China'}; 
array2={'India is in east','United States of America is USA','Made in China'} 

如果我在array2搜索array1,則:

'印度' 應符合 '印度在東部',類似的還有美國&中國。

+0

如何約2的foreach或作爲變體array_walk – Subdigger

回答

0
$a1 = array('India','USA','China'); 
$a2 = array('India is in east','United States of America is USA','Made in China'); 


foreach ($a2 as $a) 
{ 
    foreach($a1 as $b ) 
    { 
    if (strpos($a, $b) > -1) 
    { 
     echo $a . " contains " . $b . "\n"; 
    } 
    } 
} 
4
$array1 = array('India','USA','China'); 
$array2 = array('India is in east','United States of America is USA','Made in China'); 
$found = array(); 

foreach ($array1 as $key => $value) { 
    // Thanks to @Andrea for this suggestion: 
    $found[$value] = preg_grep("/$value/", $array2); 
    // Alternative: 
    //$found = $found + preg_grep("/$value/", $array2); 
} 

print_r($found); 

結果:

Array 
(
    [0] => India is in east 
    [1] => United States of America is USA 
    [2] => Made in China 
) 

使用音位是棘手。你將必須確定什麼構成匹配。一種方法是使用Methaphone結果之間的Levenshtein距離來比較兩個值。

更新:一個更明智的每個字音位比較見@Andrea's解決方案。

這裏有一個粗略的例子:

$meta1 = array_map(
    create_function('$v', 'return array(metaphone($v) => $v);'), 
    $array1 
); 

$meta2 = array_map(
    create_function('$v', 'return array(metaphone($v) => $v);'), 
    $array2 
); 

$threshold = 3; 

foreach ($meta2 as $key2 => $value2) { 

    $k2 = key($value2); 
    $v2 = $value2[$k2]; 

    foreach ($meta1 as $key1 => $value1) { 

     $k1 = key($value1); 
     $v1 = $value1[$k1]; 
     $lev = levenshtein($k2, $k1); 

     if(strpos($v2, $v1) !== false || levenshtein($k2, $k1) <= $threshold) { 
      array_push($found, $v2); 
     } 
    } 
} 

...但它需要的工作。如果閾值太高,它會產生重複。您可能更願意以兩次傳球進行比賽。一個找到簡單的匹配,就像在我的第一個代碼示例中,然後另一個匹配Metaphone,如果第一個匹配沒有返回。

+0

也許是更好$實測值[$值] = preg_grep( 「/ $值/」,$數組2) ;所以它一直保持匹配。 – Ando

+0

@Andrea:這可能會奏效,但如果在搜索到的多個元素中發現美國,就有可能覆蓋數組鍵。 – Mike

+0

我在發佈之前測試過一個像你這樣的$ array2對象,它工作得很好。 – Ando

1

該metaphone案件也可以遵循邁克提出的嚴格情況下相同的結構。

我不認爲需要額外的相似度函數,因爲metaphone的目的應該是爲我們提供一個與聽起來相同的單詞相同的密鑰。

$array1 = array('India','USA','China'); 
$array2 = array(
    'Indiuh is in east', 
    'United States of America is USA', 
    'Gandhi was born in India', 
    'Made in China' 
); 
$found = array(); 
foreach ($array1 as $key => $value) { 
    $found[$value] = preg_grep('/\b'.$value.'\b/i', $array2); 
} 

var_export($found); 

echo "\n\n"; 

function meta($sentence) 
{ 
    return implode(' ', array_map('metaphone', explode(' ', $sentence))); 
} 

$array2meta = array_map('meta', $array2); 
foreach ($array1 as $key => $value) { 
    $valuemeta = meta($value); 
    $foundmeta[$value] = preg_grep('/\b'.$valuemeta.'\b/', $array2meta); 
    $foundmeta[$value] = array_intersect_key($array2, $foundmeta[$value]); 
} 

var_export($foundmeta); 

上面的代碼打印出:

array (
    'India' => 
    array (
    2 => 'Gandhi was born in India', 
), 
    'USA' => 
    array (
    1 => 'United States of America is USA', 
), 
    'China' => 
    array (
    3 => 'Made in China', 
), 
) 

array (
    'India' => 
    array (
    0 => 'Indiuh is in east', 
    2 => 'Gandhi was born in India', 
), 
    'USA' => 
    array (
    1 => 'United States of America is USA', 
), 
    'China' => 
    array (
    3 => 'Made in China', 
), 
) 
+0

我喜歡在每個詞的基礎上執行metaphone比較的想法。我不確定OP想要什麼,但你的解決方案是有道理的。我不得不介紹Levenshtein函數來處理單詞和句子之間的元音結果的差異。 – Mike