根据展开的键值过滤数组
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);
另一种方法是在类别列上使用 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);
我有一个关联数组,
$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);
另一种方法是在类别列上使用 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);