【问题标题】:PHP: array filter matching anything containing a stringPHP:匹配任何包含字符串的数组过滤器
【发布时间】:2020-07-17 02:04:46
【问题描述】:

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

因此,换句话说,如果字符串是“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 string match wildcard array-filter


    【解决方案1】:

    您可以使用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>
    

    Demo on 3v4l.org

    【讨论】:

    • 很好,谢谢!当我进行研究时,我也看到了这个功能,但考虑到我缺乏知识,这似乎是让它工作的最深奥的方法。不清楚 stripos 函数应该在我的脚本中的什么位置。非常感谢。如果您不介意,还有一个额外的问题:使用该函数,我为什么不必像我所做的那样将我的字符串与数组的小写值进行比较 ($haystack[$k] = strtolower($v );)。默认情况下,“stripos”总是不区分大小写吗?谢谢!
    • @BachirMessaouri 不用担心。要回答额外的问题,是的,stripos 对于 needlehaystack总是不区分大小写(由 i 表示与strpos 相比的名称)
    【解决方案2】:

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

    function filterArray($needle,$haystack){
    
        foreach($haystack as $k => $v){
    
            if (stripos($v, $needle) !== false) return true;
    
        }
    
    }
    

    【讨论】:

    • 是的,非常感谢!尼克已经给了我同样的答案,我接受了,但当然,你的也一样好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多