Php 数组筛选器使用键筛选数据
我有如下数组Php 数组筛选器使用键筛选数据,php,arrays,array-filter,Php,Arrays,Array Filter,我有如下数组 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
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',
)
我需要找出具有如下父值的数组
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\u filter
函数中的数组键的访问。因此,您最好使用foreach()
并使用以下方法检查时段:
然后可以调用该函数并将其结果分配给数组。大概是这样的:
$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 )
如果保证数组中的值是唯一的,则可以执行数组翻转以交换键和值,然后执行数组过滤,然后再次执行数组翻转
$_a = array_flip($a);
$_a = array_filter($_a,function($val){
if(false === strpos($val,".")){
return true;
}
return false;
});
$a = array_flip($_a);
如果没有,您可以使用array\u walk来清空子值,然后使用array\u filter。如果null是父母的一个可能值(或任何解析为false的值),那么您可以始终选择自己的值用于孩子,并根据该值进行筛选。如果没有这样的值可以使用,则此解决方案将不起作用
$_a = $a;
array_walk($_a,function(&$val,$key){
if(false !== strpos($val,".")){
$val = null;
}
});
$a = array_filter($_a);
您还可以使用数组\ U键、数组\过滤器和数组\ U相交\键。无论值是否唯一,这都将起作用,并且与第二种解决方案不同,如果父值为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,所以我介绍了使用它的各种选项。但是,正如其他人所说,如果您需要基于键的值进行过滤,那么仅使用array_filter是无法做到这一点的。到目前为止,您拥有什么?您不能使用PHP的
array_filter()
函数,因为它只对值进行过滤,所以您尝试过一个简单的foreach()
循环吗?请注意,在我的版本中,我检查false==strpos,而不仅仅是!strpos(或false==strpos)。。。。使用此表单很好,因为如果指针作为草堆中的第一个字符出现,它将返回0。我认为在你的情况下,“.”不可能成为第一个角色,但是,像我这样做并没有什么坏处,一旦你养成了这样做的习惯,你就不必担心在重要的时候去做。虽然在你的情况下它可能会起作用,但上面的解决方案可能会在其他地方引起问题strpos($haystack,$pineel)
返回$haystack中$pineel的第一个位置,如果未找到,则返回false。因此,在这个场景中,$foo=“barbaz”;如果(!strpos($foo,bar)){echo“未找到”}否则{echo“已找到”}
您的输出将“未找到”,因为strpos将返回0。您应该始终严格检查strpos$foo=“barbaz”;如果(false==strpos($foo,“bar”){echo“找不到”}否则{echo“找到”}
将输出“找到”