在php数组中搜索部分字符串匹配

时间:2013-04-11 09:09:32

标签: php arrays string search

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

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

是否有像in_array()这样的预定义函数来完成作业而不是循环并比较每个值?

12 个答案:

答案 0 :(得分:18)

对于部分匹配,您可以迭代数组并使用字符串搜索功能,例如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)

答案 1 :(得分:6)

有几种方法......

$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;
});

为了将Closures与其他参数一起使用,有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

答案 2 :(得分:4)

你可以使用php的array_search函数。它支持PHP> = 4.0.5。

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

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

答案 3 :(得分:2)

用于像sql一样搜索'%needle%'你可以试试

$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": ""
}

答案 4 :(得分:1)

function check($string) 
{
    foreach($arr as $a) {
        if(strpos($a,$string) !== false) {
            return true;
        } 
    }
    return false;
}

答案 5 :(得分:1)

PHP 5.3 +

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

答案 6 :(得分:1)

<?php
   $a=array("a"=>"red","b"=>"green","c"=>"blue");
   echo array_search("red",$a);
?>

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

答案 7 :(得分:0)

function findStr($arr, $str) 
{  
    foreach ($arr as &$s) 
    {
       if(strpos($s, $str) !== false)
           return $s;
    }

    return "";
}

如果需要,您可以稍微修改一下将返回值更改为相应的索引号,但是因为您说“...返回$ arr [2]”我写了它以返回值。

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

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

  1. 将数组内嵌到字符串中: $ imploded = implode(“”,$ myarray);

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

    function to_lower_case($ str) {

  3. $ 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”, “A”, “O”, “U”, “O”, “Z”, “S”];

    $ to_array = [ “一”, “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”, “A”, “O”, “U”, “O”, “Z”, “S”];

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

    返回$ str;

    }

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

答案 10 :(得分:0)

这是普通或多维数组的函数。

  • 案例敏感
  • 适用于普通数组和多维数据
  • 查找全部或部分叮咬时起作用

以下是代码(版本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;
    }

}

如果只有一个匹配项,则返回该键,但如果$ column中的$ needle内有多个匹配项,那么它将返回匹配键的数组。

希望这会有所帮助:)

答案 11 :(得分:-1)

if(in_array("green",$arr)){
//true 
//do some code here
}else{
//false
//ignore
}