Php 从深度数组中任何位置存在的特定键创建唯一的值列表
我有一个数组,它由数量不确定的数组组成,递归地有n层深。每个数组可能包含一个名称键。我想创建这些值的唯一列表 范例 假设数组为:Php 从深度数组中任何位置存在的特定键创建唯一的值列表,php,recursion,multidimensional-array,array-unique,array-key,Php,Recursion,Multidimensional Array,Array Unique,Array Key,我有一个数组,它由数量不确定的数组组成,递归地有n层深。每个数组可能包含一个名称键。我想创建这些值的唯一列表 范例 假设数组为: $bigArray = array( 'name'=>'one', 'something'=>array( 'name'=>'two', 'subthing'=>array('name'=>'three') ), 'anotherthing'=>array('na
$bigArray = array(
'name'=>'one',
'something'=>array(
'name'=>'two',
'subthing'=>array('name'=>'three')
),
'anotherthing'=>array('name'=>'one')
);
预期结果将是:
$uniques = array('one', 'two', 'three') // All the 'name' keys values and without duplicates.
这是一个例子
我的方法是使用array\u walk\u递归传递$uniques数组作为引用,并允许函数更新该值:
$uniques = array();
function singleOut($item, $key, &$uniques) {
if ($key == 'name' && !in_array($itm,$uniques,true) )
$uniques[] = $item;
}
array_walk_recursive($bigArray, 'singleOut', $uniques);
然而,这对我不起作用 您也可以在这一个上使用array_unique。例如:
$uniques = array();
array_walk_recursive($bigArray, function($val, $key) use (&$uniques){
if($key == 'name') {
$uniques[] = $val;
}
});
$uniques = array_unique($uniques); // unique values
你的小提琴几乎准确无误——问题是,用户参数仅在相同的递归级别内通过引用给出。您需要将间接寻址与引用一起使用:
$bigArray = array(
'name'=>'one',
'something'=>array(
'name'=>'two',
'subthing'=>array('name'=>'three')
),
'anotherthing'=>array('name'=>'one')
);
function singleOut($item, $key, $indirect) {
$uniques=&$indirect[0];
if ($key == 'name' && !in_array($item,$uniques,true) ) $uniques[] = $item;
}
$uniques = array();
$indirect = array(&$uniques);
array_walk_recursive($bigArray, 'singleOut', $indirect);
print_r($uniques);
编辑:
Fiddle是为了避免在array\u walk\u recursive内部执行数组内检查,可以将名称值作为键存储在输出数组中。这将通过覆盖以前相同的键来有效地消除重复。当array_walk_recursive完成时,可以使用array_键将数据从键移动到值
代码:
输出:
array (
0 => 'one',
1 => 'two',
2 => 'three',
)
由于数组_unique在某些情况下速度较慢,因此使用数组_键通常会执行得更快。这就是说,如果微优化是一个问题,那么您应该使用实际数据和特定环境进行基准测试,并为您的项目选择最佳方法
正如我在Ghost的答案下的一条评论中提到的,对多维数组中的键进行===严格比较是一个好习惯,因为如果您正在查找字符串,但遇到0键,那么PHP的类型杂耍功能将提供意外的结果
下面是我讨论和演示此行为的页面:对于此问题的范围,松散的比较是可以的。但是,请访问此链接,查看在对可能为0的键进行松散比较时,由于PHP的类型转换而可能出现的意外结果。]
array (
0 => 'one',
1 => 'two',
2 => 'three',
)