簡體   English   中英

過濾並計數過濾后的數組

[英]filter and count filtered array

我正在嘗試過濾多維數組並返回為給定類別找到的條目數。

編輯

我試圖避免使用foreach。 目前正在研究使用array_intersect,但正在將數組轉換為字符串轉換錯誤。 我正在這樣做:

//filter array with category name
$category_array = array('T-Shirt','Men');
$filter_category = (array_intersect($products['result'], $category_array));
var_export($filter_category);//return data of filtered entries
echo $row_count=count($filter_category);//return number of entries

所需的結果應返回與下面完全相同的數組,但僅包含過濾后的條目。 如果有更好的方法來做我想做的事情。 我開了!

這就是未過濾的數據

$products={
        "code": 200,
        "result": [
            {
                "id": 121935189,
                "external_id": "5d27b7962ac2c1",
                "name": "RPROD7742019 Dark Green Bush Camo Men's T-Shirt ",
                "variants": 6,
                "synced": 6
            },
            {
                "id": 121934788,
                "external_id": "5d27b641b1f568",
                "name": "RPROD2282019 FOREST GREEN CAMO Men's T-shirt",
                "variants": 6,
                "synced": 6
            },
            {
                "id": 121934520,
                "external_id": "5d27b555048158",
                "name": "RPROD7542019 Men's Rash Guard T-Shirt Sweatshirt Long Sleeve",
                "variants": 7,
                "synced": 7
            },
            {
                "id": 121934241,
                "external_id": "5d27b467b817b4",
                "name": "RPROD4952019 Men's T-shirt",
                "variants": 6,
                "synced": 6
            },
            {
                "id": 121933767,
                "external_id": "5d27b34c3133a2",
                "name": "RPROD5872019 Men's T-shirt ",
                "variants": 6,
                "synced": 6
            },
            {
                "id": 121933319,
                "external_id": "5d27b12e253032",
                "name": "RPROD7662019 DARK GREEN CAMO Men's T-Shirt - Men",
                "variants": 6,
                "synced": 6
            },
            {
                "id": 121931543,
                "external_id": "5d27afd7c949b8",
                "name": "RPROD1192019 Jungle Camo Men's T-Shirt - Men",
                "variants": 6,
                "synced": 6
            },
            {
                "id": 121930567,
                "external_id": "5d27ae02dd00a8",
                "name": "RPROD7572019 Camo Short sleeve men’s t-shirt - Men",
                "variants": 6,
                "synced": 6
            },
            {
                "id": 121930354,
                "external_id": "5d27ad2a338399",
                "name": "RPROD8412019 Camo Men's T-shirt - Men",
                "variants": 6,
                "synced": 6
            },
            {
                "id": 121665999,
                "external_id": "5d251acde94bc7",
                "name": "RPROD3042019 Champion Dad Cap Trucker Cap Men",
                "variants": 2,
                "synced": 2
            },
            {
                "id": 121665890,
                "external_id": "5d251a50cb6a82",
                "name": "RPROD7162019 Vintage Cotton Twill Cap Trucker Cap Men Women",
                "variants": 3,
                "synced": 3
            },
            {
                "id": 121665703,
                "external_id": "5d2519cba9fea7",
                "name": "RPROD4872019 Dad hat Trucker Cap Men Women",
                "variants": 1,
                "synced": 1
            },
            {
                "id": 121665596,
                "external_id": "5d251972bd8b36",
                "name": "RPROD2492019 Dad hat Trucker Cap Men Women",
                "variants": 1,
                "synced": 1
            },
            {
                "id": 121665533,
                "external_id": "5d25193756ac83",
                "name": "RPROD5362019 Trucker Cap Dad hat Men Women",
                "variants": 5,
                "synced": 5
            },
            {
                "id": 121665382,
                "external_id": "5d2518ae661cf3",
                "name": "RPROD3082019 Cotton Cap Trucker Cap Dad Hat Men Women",
                "variants": 7,
                "synced": 7
            },
            {
                "id": 121665266,
                "external_id": "5d2518395f7b28",
                "name": "RPROD6372019 Trucker Cap Men Women",
                "variants": 1,
                "synced": 1
            },
            {
                "id": 121665141,
                "external_id": "5d2517dc928059",
                "name": "RPROD8112019 Trucker Cap Men Women",
                "variants": 9,
                "synced": 9
            },
            {
                "id": 121664869,
                "external_id": "5d25171b371fa4",
                "name": "RPROD7232019 Trucker Cap Men Women",
                "variants": 4,
                "synced": 4
            },
            {
                "id": 121664726,
                "external_id": "5d2516c175ad54",
                "name": "RPROD4112019 Trucker Cap Men Women",
                "variants": 5,
                "synced": 5
            },
            {
                "id": 121664599,
                "external_id": "5d251659e8a218",
                "name": "RPROD7002019 Trucker Cap Men Women",
                "variants": 1,
                "synced": 1
            },
            {
                "id": 121664477,
                "external_id": "5d251609908887",
                "name": "RPROD3232019 Trucker Cap Men Women",
                "variants": 5,
                "synced": 5
            },
            {
                "id": 121664346,
                "external_id": "5d2515ade45543",
                "name": "RPROD6702019 Trucker Cap - Men Women",
                "variants": 5,
                "synced": 5
            },
            {
                "id": 121664113,
                "external_id": "5d2515167e62e4",
                "name": "RPROD9422019 Cotton Cap Dad Hat Women Men",
                "variants": 8,
                "synced": 8
            },
            {
                "id": 121663700,
                "external_id": "5d2513fb5e6572",
                "name": "RPROD2552019 Cotton Trucker Cap Dad Hat Men Women",
                "variants": 4,
                "synced": 4
            },
            {
                "id": 121663350,
                "external_id": "5d251304231b28",
                "name": "RPROD2762019 Trucker Cap Men Women",
                "variants": 9,
                "synced": 9
            }
        ],
        "extra": [],
        "paging": {
            "total": 75,
            "offset": 0,
            "limit": 25
        }
    }

您可以為此使用array_filter 將類別數組轉換為匹配所有單詞的正則表達式; 請參閱正則表達式以匹配查詢中的所有單詞(以任何順序) 然后在過濾器函數中使用preg_match()

$regexp = '/(?=.*\bt-shirt\b)(?=.*\bmen\b)/i';
$fl_list = array_filter(function($p) use ($regexp) {
    return preg_match($regexp, $p['name']);
}, $products['result']);

我在正則表達式中也使用\\b使其與整個單詞匹配。 否則, men將與women

如果您在數據中使用真實的關鍵字,而不是嘗試匹配產品名稱中的單詞,那么事情會容易得多。

像這樣:

$category_array = array('T-Shirt', 'camo');

print_r(
  array_intersect_key(
      $products['result'],
      preg_grep(
          '/(?=.*\b'.implode('\b)(?=.*\b', $category_array).'\b)/i',
          array_column($products['result'], 'name')
      )
  )
);

輸出:

Array
(
    [0] => Array
        (
            [id] => 121935189
            [external_id] => 5d27b7962ac2c1
            [name] => RPROD7742019 Dark Green Bush Camo Men's T-Shirt 
            [variants] => 6
            [synced] => 6
        )

    [1] => Array
        (
            [id] => 121934788
            [external_id] => 5d27b641b1f568
            [name] => RPROD2282019 FOREST GREEN CAMO Men's T-shirt
            [variants] => 6
            [synced] => 6
        )

    [5] => Array
        (
            [id] => 121933319
            [external_id] => 5d27b12e253032
            [name] => RPROD7662019 DARK GREEN CAMO Men's T-Shirt - Men
            [variants] => 6
            [synced] => 6
        )

    [6] => Array
        (
            [id] => 121931543
            [external_id] => 5d27afd7c949b8
            [name] => RPROD1192019 Jungle Camo Men's T-Shirt - Men
            [variants] => 6
            [synced] => 6
        )

    [7] => Array
        (
            [id] => 121930567
            [external_id] => 5d27ae02dd00a8
            [name] => RPROD7572019 Camo Short sleeve men’s t-shirt - Men
            [variants] => 6
            [synced] => 6
        )

    [8] => Array
        (
            [id] => 121930354
            [external_id] => 5d27ad2a338399
            [name] => RPROD8412019 Camo Men's T-shirt - Men
            [variants] => 6
            [synced] => 6
        )

)

沙盒

它們都包含“ Men”,所以我不確定過濾規則應該是什么。 無論如何,經過一些調整,我改用“ camo”。

PS,如果您想更新數組,則只需執行以下操作即可,而不是print_r

$products['result'] = array_intersect_key( ... other code ... );

如果您也需要我,我可以解釋它是如何工作的。

暫無
暫無

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

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