Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从深度数组中任何位置存在的特定键创建唯一的值列表_Php_Recursion_Multidimensional Array_Array Unique_Array Key - Fatal编程技术网

Php 从深度数组中任何位置存在的特定键创建唯一的值列表

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

我有一个数组,它由数量不确定的数组组成,递归地有n层深。每个数组可能包含一个名称键。我想创建这些值的唯一列表

范例

假设数组为:

$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',
)