我有一个关联的数组,
$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 :(得分: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);
另一种方法是在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')));