过滤二维数组以保留任意列中具有不区分大小写地匹配搜索子字符串的值的行

问题描述 投票:0回答:2

我有一个脚本,它允许我根据字符串过滤整个多维数组。 但只有当数组的值与字符串完全匹配时它才会起作用,而我希望它在字符串至少包含在值中时才起作用。

因此,换句话说,如果字符串是“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);
});
....

这些改变都没有任何好处,我感觉我已经用尽了网上和这里找到的解决方案。

我也尝试使用“fnmatch”,即使我不确定如何以及在哪里使用它,但没有成功。

php arrays multidimensional-array case-insensitive array-filter
2个回答
3
投票

您可以使用

stripos
不区分大小写地搜索
$needle
值内任意位置的
$haystack

$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>

3v4l.org 上的演示


2
投票

您可以使用 stripos 来检查一个字符串是否包含另一个字符串。

function filterArray($needle,$haystack){

    foreach($haystack as $k => $v){

        if (stripos($v, $needle) !== false) return true;

    }

}
© www.soinside.com 2019 - 2024. All rights reserved.