根据展开的键值过滤数组

Filter array based on the exploded key value

我有一个关联数组,

$array2 = array(
    array('customer_id' => '01', 'categories' => '',),

     array('customer_id' => '02', 'categories' => '',),

     array('customer_id' => '03', 'categories' => '20,26,18',),

     array('customer_id' => '04', 'categories' => '45,118',),
);

我需要获取类别值为18的数组。我已经分解了类别值并在array_filter中检查了它们。

function testCategories($var)
{
    $like = 18;
    $categoryArray = array_column($var, 'categories');
    foreach($categoryArray as $ca){
    $caEplode = explode(',', $ca);
        foreach($caEplode as $cae){

            return($cae == $like);
        }
    }
}

print_r(array_filter($array2,"testCategories"));

但我返回的是一个空字符串。谁能帮帮我?

我没有使用 array_filter 但这可能没问题

<?php
    $array2 = array(
        array('customer_id' => '01', 'categories' => '',),

         array('customer_id' => '02', 'categories' => '',),

         array('customer_id' => '03', 'categories' => '20,26,18',),

         array('customer_id' => '04', 'categories' => '45,118',),
    );

    function testCategories($var)
    {
        $like = 18;
        foreach($var as $ca){
            $caEplode = explode(',', $ca['categories']);
            foreach($caEplode as $cae){
                if($cae == $like)
                  $result[] = $ca;
            }
        }
        return $result;
    }

    print_r(testCategories($array2));


     ?>

结果

Array ( [0] => Array ( [customer_id] => 03 [categories] => 20,26,18 ) )

您可以将 preg_match 与 \b 一起使用,以确保它只匹配“18”的完整单词。

$like = 18;
foreach($array2 as $val){
    if(preg_match("/\b" . $like . "\b/", $val['categories'])){
         $res[] = $val;
    }
}

var_dump($res);

https://3v4l.org/lBKVh


另一种方法是在类别列上使用 preg_grep 并使用 array_intersect_key 来获取匹配的数组。
这意味着根本不需要循环。

$like = 18;
$cat = array_column($array2, 'categories');
$match = preg_grep("/\b" . $like . "\b/", $cat);
$res = array_intersect_key($array2, $match);

var_dump($res);

https://3v4l.org/tH0n1 我认为这种方法与 array_filter 之间不会有任何或太大的区别。

也可以写成一行,读起来比较费劲,但是加上注释就显得简短了。

$res = array_intersect_key($array2, preg_grep("/\b" . $like . "\b/", array_column($array2, 'categories')));

您不必使用 array_column(),因为在 array_filter() 的回调中,categories 是参数中数组的键。您可以将 in_array()categories.

的展开值一起使用
$array2 = array(
    array('customer_id' => '01', 'categories' => '',),
    array('customer_id' => '02', 'categories' => '',),
    array('customer_id' => '03', 'categories' => '20,26,18',),
    array('customer_id' => '04', 'categories' => '45,118',),
);

function testCategories($var)
{
    $like = 18 ;
    $caEplode = explode(',', $var['categories']);
    return in_array($like, $caEplode) ;
}
print_r(array_filter($array2,"testCategories"));

输出:

Array
(
    [2] => Array
        (
            [customer_id] => 03
            [categories] => 20,26,18
        )

)

您也可以使用匿名函数并让 $like 在函数外:

$like = 18;
$out = array_filter($array2, function ($var) use ($like) {
    $caEplode = explode(',', $var['categories']);
    return in_array($like, $caEplode) ;
});
print_r($out);