45
$example = array('An example','Another example','Last example');

如何在上述数组中对“Last”一词进行松散搜索?

echo array_search('Last example',$example);

如果指针与值中的所有内容完全匹配,上面的代码只会回显值的键,这是我不想要的。我想要这样的东西:

echo array_search('Last',$example);

如果值包含单词“Last”,我希望值的键回显。

4

7 回答 7

67

要查找与您的搜索条件匹配的值,您可以使用array_filter函数:

$example = array('An example','Another example','Last example');
$searchword = 'last';
$matches = array_filter($example, function($var) use ($searchword) { return preg_match("/\b$searchword\b/i", $var); });

现在$matches数组将只包含原始数组中包含最后一个单词的元素(不区分大小写)。

如果您需要查找与条件匹配的值的键,则需要遍历数组:

$example = array('An example','Another example','One Example','Last example');
$searchword = 'last';
$matches = array();
foreach($example as $k=>$v) {
    if(preg_match("/\b$searchword\b/i", $v)) {
        $matches[$k] = $v;
    }
}

现在数组$matches包含来自原始数组的键值对,其中值包含(不区分大小写)单词last

于 2012-09-07T09:43:42.213 回答
22
function customSearch($keyword, $arrayToSearch){
    foreach($arrayToSearch as $key => $arrayItem){
        if( stristr( $arrayItem, $keyword ) ){
            return $key;
        }
    }
}
于 2012-09-07T09:45:50.560 回答
14
$input= array('An example','Another example','Last example');
$needle = 'Last';
$ret = array_keys(array_filter($input, function($var) use ($needle){
    return strpos($var, $needle) !== false;
}));

这将为您提供其值包含针的所有键。

于 2012-09-07T09:45:23.600 回答
2

它通过第一个匹配找到元素的键:

echo key(preg_grep('/\b$searchword\b/i', $example));

如果您需要所有键,请使用 foreach:

foreach (preg_grep('/\b$searchword\b/i', $example) as $key => $value) {
  echo $key;
}
于 2012-09-07T09:54:43.760 回答
0

我不喜欢正则表达式,因为据我所知,它们总是比普通的字符串函数慢。所以我的解决方案是:

function substr_in_array($needle, array $haystack)
{
    foreach($haystack as $value)
    {
        if(strpos($value, $needle) !== FALSE) return TRUE;
    }
    return FALSE;
}
于 2018-06-27T06:30:51.827 回答
0

Aleks G 给出的答案不够准确。

$example = array('An example','Another example','One Example','Last example');
$searchword = 'last';
$matches = array();
foreach($example as $k=>$v) {
    if(preg_match("/\b$searchword\b/i", $v)) {
        $matches[$k] = $v;
    }
}

线

if(preg_match("/\b$searchword\b/i", $v)) {

应该换成这些

$match_result = preg_match("/\b$searchword\b/i", $v);
if( $match_result!== false && $match_result === 1 ) {

或者更简单地说

if( preg_match("/\b$searchword\b/i", $v) === 1 ) {

http://php.net/manual/en/function.preg-match.php一致

如果模式匹配给定的主题,preg_match() 返回 1,如果不匹配,则返回 0,如果发生错误,则返回 FALSE。

于 2018-07-23T11:51:48.477 回答
-1

我也在寻找解决 OP 问题的方法,我通过 Google 偶然发现了这个问题。然而,这些答案都没有对我有用,所以我想出了一些不同的东西,效果很好。

$arr = array("YD-100 BLACK", "YD-100 GREEN", "YD-100 RED", "YJ-100 BLACK");
//split model number from color
$model = explode(" ",$arr[0])
//find all values that match the model number
$match_values = array_filter($arr, function($val,$key) use (&$model) { return stristr($val, $model[0]);}, ARRAY_FILTER_USE_BOTH);
//returns
//[0] => YD-100 BLACK
//[1] => YD-100 GREEN
//[2] => YD-100 RED

这仅适用于 PHP 5.6.0 及更高版本。

于 2017-02-22T23:46:17.740 回答