PHP: 匹配任何包含字符串的数组过滤器
PHP: array filter matching anything containing a string
我有一个脚本可以根据字符串过滤整个多维数组。
但只有当数组的值与字符串完全匹配时它才会起作用,而我希望它在字符串至少包含在值中时起作用。
所以,换句话说,如果字符串是 "nana",我希望过滤让值 "Banana" 和 "Ananas" 匹配。
因此,我希望在“%nana%”上进行搜索,以便允许 "nana" 字符串前后的任意字母组合。
到目前为止,这是我的代码:
$dataset=[[3,"Yellow","Banana"], [2,"Brown","Ananas"], [1,"Green","brown"]];
$dataset = array_filter($dataset, function ($v){
return filterArray('anana', $v);
});
function filterArray($needle,$haystack){
$needle = strtolower($needle);
foreach($haystack as $k => $v){
$haystack[$k] = strtolower($v);
};
return in_array($needle,$haystack);
}
echo '<pre>'; print_r($dataset); echo '</pre>';
这行不通。
我做了功课,发现 "fnmatch" 或 "preg_match" 在这种情况下被引用得相当频繁。问题是我看不到它们应该在我的脚本中的什么位置。我浏览过的案例千差万别,以至于我在这里不知道如何正确使用它们。
因此,这不是寻找合适的功能本身,而是了解如何以及在何处使用它。
我试过了,但没用:
....
foreach($haystack as $k => $v){
if(preg_match('/^'.$needle.'$/i', $v)) {
$haystack[$k] = strtolower($v);
}
};
....
这也不起作用:
....
foreach($haystack as $k => $v){
if(preg_match("/\b$needle\b/i", $v)) {
$haystack[$k] = strtolower($v);
}
};
....
我也试过这个:
....
$dataset = array_filter(dataset, function ($v){
return filter((bool)preg_match("/$needle/i",$v);
});
....
None 这些更改有任何好处,我觉得我已经用尽了在线和此处找到的解决方案。
我也尝试过使用 "fnmatch",即使我不确定如何以及在何处使用它,但没有成功。
因此,我们将不胜感激。
您可以使用 stripos
对 $haystack
值内任意位置的 $needle
进行不区分大小写的搜索:
$dataset=[[3,"Yellow","Banana"], [2,"Brown","Ananas"], [1,"Green","brown"]];
$dataset = array_filter($dataset, function ($v){
return filterArray('anana', $v);
});
function filterArray($needle,$haystack){
foreach($haystack as $v){
if (stripos($v, $needle) !== false) return true;
};
return false;
}
echo '<pre>'; print_r($dataset); echo '</pre>';
输出:
<pre>Array
(
[0] => Array
(
[0] => 3
[1] => Yellow
[2] => Banana
)
[1] => Array
(
[0] => 2
[1] => Brown
[2] => Ananas
)
)
</pre>
您可以使用 stripos 来检查一个字符串是否包含另一个字符串。
function filterArray($needle,$haystack){
foreach($haystack as $k => $v){
if (stripos($v, $needle) !== false) return true;
}
}
我有一个脚本可以根据字符串过滤整个多维数组。 但只有当数组的值与字符串完全匹配时它才会起作用,而我希望它在字符串至少包含在值中时起作用。
所以,换句话说,如果字符串是 "nana",我希望过滤让值 "Banana" 和 "Ananas" 匹配。 因此,我希望在“%nana%”上进行搜索,以便允许 "nana" 字符串前后的任意字母组合。
到目前为止,这是我的代码:
$dataset=[[3,"Yellow","Banana"], [2,"Brown","Ananas"], [1,"Green","brown"]];
$dataset = array_filter($dataset, function ($v){
return filterArray('anana', $v);
});
function filterArray($needle,$haystack){
$needle = strtolower($needle);
foreach($haystack as $k => $v){
$haystack[$k] = strtolower($v);
};
return in_array($needle,$haystack);
}
echo '<pre>'; print_r($dataset); echo '</pre>';
这行不通。
我做了功课,发现 "fnmatch" 或 "preg_match" 在这种情况下被引用得相当频繁。问题是我看不到它们应该在我的脚本中的什么位置。我浏览过的案例千差万别,以至于我在这里不知道如何正确使用它们。 因此,这不是寻找合适的功能本身,而是了解如何以及在何处使用它。
我试过了,但没用:
....
foreach($haystack as $k => $v){
if(preg_match('/^'.$needle.'$/i', $v)) {
$haystack[$k] = strtolower($v);
}
};
....
这也不起作用:
....
foreach($haystack as $k => $v){
if(preg_match("/\b$needle\b/i", $v)) {
$haystack[$k] = strtolower($v);
}
};
....
我也试过这个:
....
$dataset = array_filter(dataset, function ($v){
return filter((bool)preg_match("/$needle/i",$v);
});
....
None 这些更改有任何好处,我觉得我已经用尽了在线和此处找到的解决方案。
我也尝试过使用 "fnmatch",即使我不确定如何以及在何处使用它,但没有成功。
因此,我们将不胜感激。
您可以使用 stripos
对 $haystack
值内任意位置的 $needle
进行不区分大小写的搜索:
$dataset=[[3,"Yellow","Banana"], [2,"Brown","Ananas"], [1,"Green","brown"]];
$dataset = array_filter($dataset, function ($v){
return filterArray('anana', $v);
});
function filterArray($needle,$haystack){
foreach($haystack as $v){
if (stripos($v, $needle) !== false) return true;
};
return false;
}
echo '<pre>'; print_r($dataset); echo '</pre>';
输出:
<pre>Array
(
[0] => Array
(
[0] => 3
[1] => Yellow
[2] => Banana
)
[1] => Array
(
[0] => 2
[1] => Brown
[2] => Ananas
)
)
</pre>
您可以使用 stripos 来检查一个字符串是否包含另一个字符串。
function filterArray($needle,$haystack){
foreach($haystack as $k => $v){
if (stripos($v, $needle) !== false) return true;
}
}