PHP:匹配任何包含字符串的数组过滤器

问题描述 投票:1回答: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 string match wildcard array-filter
2个回答
2
投票

您可以使用striposstripos值内的任何位置的$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>


2
投票

您可以使用Demo on 3v4l.org检查一个字符串是否包含另一个字符串。

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