У меня есть связанный массив,
$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 ) )
Вам не нужно использовать 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);
Вы можете использовать preg_match с \ b, чтобы убедиться, что он соответствует только полным словам «18».
$like = 18;
foreach($array2 as $val){
if(preg_match("/\b" . $like . "\b/", $val['categories'])){
$res[] = $val;
}
}
var_dump($res);
Другой метод — использовать 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')));