Массив фильтров на основе значения разнесенного ключа

У меня есть связанный массив,

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

Но я возвращаю пустую строку. Кто-нибудь может мне помочь, пожалуйста?

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 ) )
0

Другие решения

Вам не нужно использовать 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);
3

Вы можете использовать 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')));
0