簡體   English   中英

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”。 問題是我看不到它們應該在我的腳本中的位置。 我瀏覽過的案例差異很大,以至於我不知道如何在這里正確使用它們。 因此,這不是尋找正確的 function 本身,而是了解如何以及在何處使用它。

我試過了,但沒有用:

....
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”,即使我不確定如何以及在何處使用它,但沒有成功。

所以任何幫助將不勝感激。

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

Output:

<pre>Array
(
    [0] => Array
        (
            [0] => 3
            [1] => Yellow
            [2] => Banana
        )
    [1] => Array
        (
            [0] => 2
            [1] => Brown
            [2] => Ananas
        )
)
</pre>

3v4l.org 上的演示

您可以使用stripos來檢查一個字符串是否包含另一個字符串。

function filterArray($needle,$haystack){

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

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

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM