[英]array filter to filter datas using key
我有下面的数组
array('1'=>'parent 1',
'1.1'=>'1st child of 1',
'1.2'=>'2nd child of 1',
'2'=>'parent 2',
'2.1'=>'1st child of 2',
'2.2'=>'2nd child of 2',
'3'=>'parent 3',
'3.1'=>'1st child of 3',
'3.2'=>'2nd child of 4'
)
我需要找出具有父值的数组,如下所示
array('1'=>'parent 1',
'2'=>'parent 2',
'3'=>'parent 3',
)
我如何在这里使用数组过滤器?
您最好检查是否存在.
如果更改名称,请在键中输入,而不要输入多个条目的实际值。
不幸的是,PHP不提供对array_filter
函数内部的数组键的array_filter
。 因此,最好使用foreach()
并使用strpos()
检查周期:
function parentsOnly($arr)
{
$retArr = array();
foreach($arr as $key => $val)
{
if(strpos('.', $key) === false)
{
$retArr[$key] = $value;
}
}
return $retArr;
}
然后,您可以调用该函数并将其结果分配给数组。 像这样:
$parentArray = parentsOnly($array);
如果数组值中没有重复项,并且它们都是字符串:
$result = array_flip(
array_filter(
array_flip($myArray),
function ($value) {
return strpos('.', $value === false);
}
)
);
它可能只是一个简单的调整
$arr=array('1'=>'parent 1',
'1.1'=>'1st child of 1',
'1.2'=>'2nd child of 1',
'2'=>'parent 2',
'2.1'=>'1st child of 2',
'2.2'=>'2nd child of 2',
'3'=>'parent 3',
'3.1'=>'1st child of 3',
'3.2'=>'2nd child of 4'
);
$f = array_filter(array_keys($arr), function ($k){ return !strpos($k,"."); });
$filter = array_intersect_key($arr, array_flip($f));
print_r($filter);
产量
Array ( [1] => parent 1 [2] => parent 2 [3] => parent 3 )
如果保证在数组中具有唯一值,则可以执行array_flip交换键和值,然后依次交换array_filter和array_flip
$_a = array_flip($a);
$_a = array_filter($_a,function($val){
if(false === strpos($val,".")){
return true;
}
return false;
});
$a = array_flip($_a);
如果不是,则可以使用array_walk使子值无效,然后使用array_filter。 如果null对父母来说是一个可能的值(或任何解析为false的值),那么您始终可以选择自己的用于孩子,并以此过滤。 如果没有可以使用的值,则此解决方案将无法使用。
$_a = $a;
array_walk($_a,function(&$val,$key){
if(false !== strpos($val,".")){
$val = null;
}
});
$a = array_filter($_a);
您还可以使用array_keys,array_filter和array_intersect_keys。 无论值是否唯一,这都将起作用,并且与第二种解决方案不同,如果父值为null,则它将起作用。
$_a = array_keys($a);
$_a = array_filter($_a,function($val){
if(false === strpos($val,".")){
return true;
}
return false;
});
$_a = array_flip($_a); //1=>foo, 2=>bar becomes foo=>1, bar=>2
$a = array_intersect_keys($a,$_a);
我知道在可能的情况下使用数组函数通常更可取,但是我不确定上述任何解决方案是否会比简单的foreach更好:
$_a = [];
foreach($a as $k=>$v){
if(false === strpos($k,".")){
$_a[$k] = $v;
}
}
但是,您最初的问题询问如何使用array_filter,因此我提供了各种使用它的选项。 但是,正如其他人所述,如果您需要根据键的值进行过滤,则无法使用JUST array_filter进行此操作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.