Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php数组中搜索部分字符串匹配_Php_Arrays_String_Search - Fatal编程技术网

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

在php数组中搜索部分字符串匹配,php,arrays,string,search,Php,Arrays,String,Search,我有一个数组,我想搜索字符串'green'。因此,在这种情况下,它应该返回$arr[2] $arr = array(0 => 'blue', 1 => 'red', 2 => 'green string', 3 => 'red'); 是否有任何预定义的函数(如in_array())来执行作业而不是在其中循环并比较每个值?对于部分匹配,您可以迭代数组并使用类似的字符串搜索函数 对于精确匹配,请使用 您可以使用php的preg_grep函数。它在PHP>=4.0.5中受支持

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

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

是否有任何预定义的函数(如in_array())来执行作业而不是在其中循环并比较每个值?

对于部分匹配,您可以迭代数组并使用类似的字符串搜索函数

对于精确匹配,请使用


您可以使用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_数组
包含数组的匹配元素

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

    return "";
}

如果需要,您可以将返回值更改为相应的索引号,只需稍加修改,但由于您说“…返回$arr[2]”,因此我写它是为了返回值。

有几种方法

$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); }
$results = array_filter($arr, function($value) {
    return strpos($value, 'green') !== false;
});
使用数组过滤器():

$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); }
$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); }
下面是一个工作示例:

PHP5.3+

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

对于使用类似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": ""
}


我也有同样的问题,所以尝试一下…

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

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

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

  • 将数组内爆为字符串:$introded=introde(“,$myarray”)

  • 使用自定义函数将内爆字符串转换为小写: $lowercased\u introded=到小写($introded)

    函数到小写字母($str) {

  • $from_数组=[“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_数组=[“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($key=>$val){$str=str_替换($val,$to_数组[$key],$str);}

    返回$str

    }

  • 使用普通strpos搜索匹配:if(strpos($lowercased_内爆,“substring_to_find”)!==false{do something}

  • 这是用于普通数组或多维数组的函数

    • 区分大小写
    • 适用于普通阵列和多维阵列
    • 查找全部或部分螫刺时有效
    下面是代码(第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 
    
    仅对于多维数组-$列与每个数组中的键的名称相关。 如果$pinder出现了不止一次,我建议将其添加到数组中,以将每个键添加到数组中

    下面是一个示例,如果您希望有多个匹配项(版本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;
        }
    
    }
    
    如果只有一个匹配项,则返回键,但如果$pinder在任何$column中有多个匹配项,则返回匹配键的数组


    希望这有帮助:)

    什么?只需在阵列上使用
    for loop
    并比较值。如果是这样,您可以在下面的答案中看到。不要忘记正确使用strpo
    if(strpos($string,'green')!==FALSE)
    array\u search()
    不起作用,因为它与数组()中的
    非常相似,它只查找精确的匹配项,而不是子字符串。@peterm只从正则表达式中删除^
    strpos()
    从不返回
    true
    ,它只返回整数或
    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 
    
    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;
        }
    
    }