根据分解的键值过滤数组

时间:2018-05-03 10:10:51

标签: php arrays array-filter array-column

我有一个关联的数组,

$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"));

但我正在返回一个空字符串。任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:3)

您不必使用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);

答案 1 :(得分:0)

我没有使用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 ) )

答案 2 :(得分:0)

您可以将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

另一种方法是在categories列上使用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')));