【问题标题】:Search for PHP array element containing string [duplicate]搜索包含字符串的 PHP 数组元素 [重复]
【发布时间】:2012-09-01 04:27:21
【问题描述】:
$example = array('An example','Another example','Last example');

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

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

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

echo array_search('Last',$example);

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

【问题讨论】:

  • 循环遍历数组,使用你喜欢的字符串比较方法,记住关键...

标签: php arrays


【解决方案1】:

要查找符合您的搜索条件的值,您可以使用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 数组将只包含原始数组中包含单词 last 的元素(不区分大小写)。

如果你需要找到符合条件的值的键,那么你需要遍历数组:

$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

【讨论】:

  • 如果您不想通过正则表达式查找,请不要忘记将preg_quote() 添加到$searchword
  • 实际上,这给出了一个语法错误,未知在哪里并且它不起作用...当我像 $matches = array_filter($example, function($var) use ($searchword) { return preg_match("/\b$searchword\b/i", $var); });脚本继续工作,当我添加它时它会中断。
  • @LachezarRaychev 您使用的是什么版本的 php?它适用于 5.4、5.5 和 5.6。
  • 这在技术上没有任何问题,但我一生都无法理解为什么在这里使用正则表达式不会 strpos() 工作得一样好并且更快?
  • @billynoah 是的,它会 :)
【解决方案2】:
function customSearch($keyword, $arrayToSearch){
    foreach($arrayToSearch as $key => $arrayItem){
        if( stristr( $arrayItem, $keyword ) ){
            return $key;
        }
    }
}

【讨论】:

  • @MarcioSimao 这只会返回第一个匹配元素的键,而不是所有匹配的键数组。
  • @AleksG,这正是我想要的。如果我没记错的话,问题是关于同一件事的。最后一个用户的短语是“如果值包含单词“Last”,我希望值的键回显”
  • @MarcioSimao 可能它会为您解决问题,但仅限于单个匹配。如果您有多个包含单词 last 的值,您只会找到带有此代码的第一个值。
  • @AleksG,感谢您的建议!但就我而言,我需要找到第一个键,所以这段代码更加优化和清晰。
  • php 手册指出,出于效率原因,不应使用strstr()stristr() 检查子字符串的存在。
【解决方案3】:
$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;
}));

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

【讨论】:

    【解决方案4】:

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

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

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

    foreach (preg_grep('/\b$searchword\b/i', $example) as $key => $value) {
      echo $key;
    }
    

    【讨论】:

    • 甚至是array_keys(preg_grep('/\b$searchword\b/i', $example))。我需要相同的功能,并打算编写一个包装函数,但这是完美的。
    • 在模式中添加变量时,我们应该看到preg_quote()
    【解决方案5】:

    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。

    【讨论】:

    • 将变量添加到模式中时,我们应该看到preg_quote()。在循环中用作过滤器的preg_match() 更优雅地表示为preg_grep()
    【解决方案6】:

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

    function substr_in_array($needle, array $haystack)
    {
        foreach($haystack as $value)
        {
            if(strpos($value, $needle) !== FALSE) return TRUE;
        }
        return FALSE;
    }
    

    【讨论】:

    • 这不会按需要返回密钥(并在其他地方演示)。
    【解决方案7】:

    我也在寻找解决 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 及更高版本。

    【讨论】:

    • 这与 OP 的问题/示例数据/要求有所不同。
    • @mickmackusa 在寻找解决方案时首次出现在 Google 上,由于上​​述解决方案都没有帮助我,我不得不提出自己的解决方案。我发布它是为了让其他寻找解决方案的人可以从中受益。
    • 当您有一个新问题无法通过现有页面解决时,请提出一个新问题,然后自行回答。这样可以避免问题偏差。发布在给定页面上的答案有望解决 OP 的问题,但您的答案会忽略 OP 的问题。
    • 此外,ARRAY_FILTER_USE_BOTH 在这里毫无用处,php 手册建议不要使用strstr() 作为检查子字符串是否存在的方法。 strstr($arr[0], ' ', true) 应该获取前导子字符串。没有理由通过引用修改前导子字符串,因为您从不修改它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2021-01-04
    • 2013-11-06
    • 2012-05-05
    相关资源
    最近更新 更多