在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快得多:
这是用于普通数组或多维数组的函数
- 区分大小写
- 适用于普通阵列和多维阵列
- 查找全部或部分螫刺时有效
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
并比较值。如果是这样,您可以在下面的答案中看到。不要忘记正确使用strpoif(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;
}
}