【问题标题】:search a php array for partial string match [duplicate]在 php 数组中搜索部分字符串匹配 [重复]
【发布时间】:2013-04-03 09:56:50
【问题描述】:

我有一个数组,我想搜索字符串'green'。所以在这种情况下它应该返回$arr[2]

$arr = array(0 => 'blue', 1 => 'red', 2 => 'green string', 3 => 'red');

有没有像 in_array() 这样的预定义函数来完成这项工作而不是循环遍历它并比较每个值?

【问题讨论】:

  • 什么?只需在数组上使用 for loop 并比较值
  • 是的,你可以在下面的答案中看到

标签: php arrays string search


【解决方案1】:

对于部分匹配,您可以迭代数组并使用字符串搜索函数,例如strpos()

function array_search_partial($arr, $keyword) {
    foreach($arr as $index => $string) {
        if (strpos($string, $keyword) !== FALSE)
            return $index;
    }
}

对于完全匹配,请使用in_array()

in_array('green', $arr)

【讨论】:

  • 别忘了正确使用strpos。 if (strpos($string, 'green') !== FALSE)
  • 这个问题清楚地表明循环不是一个选项,因为它太明显了
【解决方案2】:
function check($string) 
{
    foreach($arr as $a) {
        if(strpos($a,$string) !== false) {
            return true;
        } 
    }
    return false;
}

【讨论】:

  • 这个问题清楚地表明循环不是一种选择。
【解决方案3】:

你可以使用php的preg_grep函数。它在 PHP >= 4.0.5 中受支持。

$array = array(0 => 'blue', 1 => 'red', 2 => 'green string', 3 => 'red');
$m_array = preg_grep('/^green\s.*/', $array);

$m_array 包含匹配的数组元素。

【讨论】:

  • array_search() 不起作用,因为它与in_array() 非常相似,它只查找完全匹配,而不是子字符串。
  • @peterm 只是从正则表达式中删除 ^
【解决方案4】:
function findStr($arr, $str) 
{  
    foreach ($arr as &$s) 
    {
       if(strpos($s, $str) !== false)
           return $s;
    }

    return "";
}

如果你愿意,你可以稍微修改一下,将返回值更改为对应的索引号,但是既然你说“...返回 $arr[2]”,我写它是为了返回值。

【讨论】:

  • 这行不通。 strpos() 从不返回 true,它只返回一个整数或 false
  • 这个问题清楚地表明循环不是一种选择。
【解决方案5】:

有几种方法...

$arr = array(0 => 'blue', 1 => 'red', 2 => 'green string', 3 => 'red');

使用循环搜索数组:

$results = array();

foreach ($arr as $value) {

  if (strpos($value, 'green') !== false) { $results[] = $value; }

}

if( empty($results) ) { echo 'No matches found.'; }
else { echo "'green' was found in: " . implode('; ', $results); }

使用 array_filter():

$results = array_filter($arr, function($value) {
    return strpos($value, 'green') !== false;
});

为了将闭包与其他参数一起使用,有use-关键字。所以你可以把它抽象出来包装成一个函数:

function find_string_in_array ($arr, $string) {

    return array_filter($arr, function($value) use ($string) {
        return strpos($value, $string) !== false;
    });

}

$results = find_string_in_array ($arr, 'green');

if( empty($results) ) { echo 'No matches found.'; }
else { echo "'green' was found in: " . implode('; ', $results); }

这是一个工作示例:http://codepad.viper-7.com/xZtnN7

【讨论】:

    【解决方案6】:

    PHP 5.3+

    array_walk($arr, function($item, $key) {
        if(strpos($item, 'green') !== false) {
            echo 'Found in: ' . $item . ', with key: ' . $key;
        }
    });
    

    【讨论】:

      【解决方案7】:

      使用 '%needle%' 进行类似 sql 的搜索,您可以尝试使用

      $input = preg_quote('gree', '~'); // don't forget to quote input string!
      $data = array(
          1 => 'orange',
          2 => 'green string',
          3 => 'green', 
          4 => 'red', 
          5 => 'black'
          );
      $result = preg_filter('~' . $input . '~', null, $data);
      

      结果是

      {
        "2": " string",
        "3": ""
      }
      

      【讨论】:

        【解决方案8】:
        <?php
           $a=array("a"=>"red","b"=>"green","c"=>"blue");
           echo array_search("red",$a);
        ?>
        

        我有同样的问题,所以试试这个...

        【讨论】:

        • 此人要求部分匹配。不完全匹配。
        【解决方案9】:

        在整个数组中快速搜索一个短语可能是这样的:

        if (preg_match("/search/is", var_export($arr, true))) {
            // match
        }
        

        【讨论】:

          【解决方案10】:

          为了找出数组中是否存在 UTF-8 不区分大小写的子字符串,我发现这种方法会比使用 mb_strtolower 或 mb_convert_case 快得多:

          1. 将数组内插为字符串:$imploded=implode(" ", $myarray);.

          2. 使用自定义函数将内爆字符串转换为小写: $lowercased_imploded = to_lower_case($imploded);

            函数 to_lower_case($str) {

          $from_array=["A","B","C","D","E","F","G","H","I","J","K" ,"L","M","N","O","P","Q","R","S","T","U","V","W"," X","Y","Z","Ä","Ö","Ü","Õ","Ž","Š"];

          $to_array=["a","b","c","d","e","f","g","h","i","j","k" ,"l","m","n","o","p","q","r","s","t","u","v","w"," x","y","z","ä","ö","ü","õ","ž","š"];

          foreach($from_array as $key=>$val){$str=str_replace($val, $to_array[$key], $str);}

          返回 $str;

          }

          1. 使用普通 strpos 搜索匹配:if(strpos($lowercased_imploded, "substring_to_find")!==false){do something}

          【讨论】:

            【解决方案11】:

            这是一个用于普通或多维数组的函数。

            • 不区分大小写
            • 适用于普通数组和多维数组
            • 在发现全部或部分蜇伤时有效

            这是代码(版本 1)

            function array_find($needle, array $haystack, $column = null) {
            
                if(is_array($haystack[0]) === true) { // check for multidimentional array
            
                    foreach (array_column($haystack, $column) as $key => $value) {
                        if (strpos(strtolower($value), strtolower($needle)) !== false) {
                            return $key;
                        }
                    }
            
                } else {
                    foreach ($haystack as $key => $value) { // for normal array
                        if (strpos(strtolower($value), strtolower($needle)) !== false) {
                            return $key;
                        }
                    }
                }
                return false;
            } 
            

            这是一个例子:

            $multiArray = array(
                 0 => array(
                          'name' => 'kevin',
                          'hobbies' => 'Football / Cricket'),
                  1 => array(
                          'name' => 'tom',
                          'hobbies' => 'tennis'),
                   2 => array(
                          'name' => 'alex',
                          'hobbies' => 'Golf, Softball')
            );
            $singleArray = array(
                    0 => 'Tennis',
                    1 => 'Cricket',
            );
            
            echo "key is - ". array_find('cricket', $singleArray); // returns - key is - 1
            echo "key is - ". array_find('cricket', $multiArray, 'hobbies'); // returns - key is - 0 
            

            仅适用于多维数组 - $column 与每个数组中的键名相关。 如果 $needle 出现不止一次,我建议添加到此以将每个键添加到数组中。

            下面是一个示例,如果您期望多个匹配(版本 2)

            function array_find($needle, array $haystack, $column = null) {
            
                $keyArray = array();
            
                if(is_array($haystack[0]) === true) { // for multidimentional array
            
                    foreach (array_column($haystack, $column) as $key => $value) {
                        if (strpos(strtolower($value), strtolower($needle)) !== false) {
                            $keyArray[] = $key;
            
                        }
                    }
            
                } else {
                    foreach ($haystack as $key => $value) { // for normal array
                        if (strpos(strtolower($value), strtolower($needle)) !== false) {
                            $keyArray[] = $key;
                        }
                    }
                }
            
                if(empty($keyArray)) {
                    return false;
                }
                if(count($keyArray) == 1) {
                    return $keyArray[0];
                } else {
                    return $keyArray;
                }
            
            }
            

            如果它只有一个匹配项,则返回键,但如果 $needle 在任何 $column 中有多个匹配项,则它将返回匹配键的数组。

            希望这会有所帮助:)

            【讨论】:

            • 这个问题清楚地表明循环不是一种选择。
            猜你喜欢
            • 2014-09-07
            • 1970-01-01
            • 1970-01-01
            • 2017-05-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多