2

我想搜索完整的字符串或字符串的一部分是否是数组的一部分。如何在 PHP 中实现这一点?

另外,我怎样才能在其中使用变音器?

例子:

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

如果我搜索array1in array2,那么:

'India' 应该匹配 'India is in east' 并且同样适用于美国和中国。

4

3 回答 3

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
)

使用 Metaphone 比较棘手。您必须确定什么构成匹配。一种方法是使用 Methaphone 结果之间的 Levenshtein 距离来比较两个值。

更新:请参阅@Andrea 的解决方案,以获得更明智的每个单词 Metaphone 比较。

这是一个粗略的例子:

$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 匹配,如果第一个返回没有匹配项。

于 2011-07-19T10:43:14.150 回答
1

变音位案例也可以遵循 Mike 针对严格案例提出的相同结构。

我认为不需要额外的相似函数,因为变音位的目的应该是为我们提供一个与发音相同的单词通用的键。

$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',
  ),
)
于 2011-07-19T13:29:02.993 回答
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";
    }
  }
}
于 2011-07-19T10:01:55.240 回答