在php中查找多维数组中的所有二级键

时间:2009-09-21 17:32:44

标签: php arrays multidimensional-array key

我想生成一个使用的第二级密钥列表。每条记录都不包含所有相同的密钥。但我需要知道所有的密钥是什么。 array_keys()不起作用,它只返回一个数字列表。

基本上我正在寻找的输出是:

action,id,validate,Base,Ebase,Ftype,Qty,Type,Label,Unit

我有一个大型的多维数组,其格式如下:

Array
(
    [0] => Array
        (
            [action] => A
            [id] => 1
            [validate] => yes
            [Base] => Array
                (
                    [id] => 2945
                )

            [EBase] => Array
                (
                    [id] => 398
                )

            [Qty] => 1
            [Type] => Array
                (
                    [id] => 12027
                )

            [Label] => asfhjaflksdkfhalsdfasdfasdf
            [Unit] => asdfas
        )

    [1] => Array
        (
            [action] => A
            [id] => 2
            [validate] => yes
            [Base] => Array
                (
                    [id] => 1986
                )

            [FType] => Array
                (
                    [id] => 6
                )

            [Qty] => 1
            [Type] => Array
                (
                    [id] => 13835
                )

            [Label] => asdssdasasdf
            [Unit] => asdger
        )
)

感谢您的帮助!

11 个答案:

答案 0 :(得分:20)

<?php

// Gets a list of all the 2nd-level keys in the array
function getL2Keys($array)
{
    $result = array();
    foreach($array as $sub) {
        $result = array_merge($result, $sub);
    }        
    return array_keys($result);
}

?>

编辑:删除了多余的array_reverse()函数

答案 1 :(得分:9)

array_keys(call_user_func_array('array_merge', $a));

合并所有值并检索生成的键。

答案 2 :(得分:6)

foreach($bigArray as $array){    
    foreach($array as $key=>$value){
        echo $key;
    }
}

那应该做你想要的。

答案 3 :(得分:5)

这样的事情:

$your_keys = array_keys($your_array[0]);

当然,这是考虑所有子阵列都有相同的键;在这种情况下,你只需要第一个子数组的键(我猜不需要迭代所有的第一级子数组)


而且,作为一个缩短/简化的例子:

$your_array = array(
    array(
        'action' => 'A',
        'id' => 1,
        'base' => array('id' => 145),
    ),
    array(
        'action' => 'B',
        'id' => 2,
        'base' => array('id' => 145),
    ),
    array(
        'action' => 'C',
        'id' => 3,
        'base' => array('id' => 145),
    )
);

$your_keys = array_keys($your_array[0]);
var_dump($your_keys);

会得到你:

array
  0 => string 'action' (length=6)
  1 => string 'id' (length=2)
  2 => string 'base' (length=4)

您可以使用implode获取您要求的字符串:

echo implode(', ', $your_keys);

会得到你:

action, id, base

即第一个子阵列的键列表。

答案 4 :(得分:4)

一个班轮:

$keys=array_unique(array_reduce(array_map('array_keys',$data),'array_merge',[]));

或在函数中:

function get_array_children_keys($data) {
    return array_unique(
        array_reduce(array_map('array_keys', $data), 'array_merge', [])
    );
}

现在让我们通过一个例子来解决这个问题,这里有一些示例数据:

[
    ['key1' => 0],
    ['key1' => 0, 'key2' => 0],
    ['key3' => 0]
]

从最内层函数开始,我们使用array_keys函数运行array_map:

array_map('array_keys', $data)

这为我们提供了所有子数组的键

[
    ['key1'],
    ['key1', 'key2'],
    ['key3']
]

然后我们使用array_merge回调和一个空数组作为初始值对数据运行array_reduce:

array_reduce(..., 'array_merge', []);

这将我们的多个数组转换为1个平面数组:

[
    'key1',
    'key1',
    'key2',
    'key3'
]

现在我们用array_unique删除我们的副本:

array_unique(...)

最后得到我们所有的钥匙:

[
    'key1',
    'key2',
    'key3'
]

答案 5 :(得分:1)

function  __getAll2Keys($array_val){
        $result = array();
        $firstKeys = array_keys($array_val);
        for($i=0;$i<count($firstKeys);$i++){
            $key = $firstKeys[$i];
            $result = array_merge($result,array_keys($array_val[$key]));
        }
        return $result;
    }

尝试此功能。它将根据您的需要返回。

答案 6 :(得分:1)

虽然@raise答案提供了一个快捷方式,但它使用数字键失败。以下内容应解决此问题:

$secondKeys=array_unique(call_user_func_array('array_merge', array_map('array_keys',$a)));

array_map('array_keys',$a):获取密钥时循环访问

...'array_merge'...:合并键数组

array_unique(... :(可选)获取唯一键。

我希望它有所帮助。

<强>更新

或者你可以使用

$secondKeys=array_unique(array_merge(...array_map('array_keys', $a)));

这提供了与上述相同的答案,并且更快。

答案 7 :(得分:0)

也许您可以使用array_map函数,它允许您避免数组迭代并返回一个数组,其中包含您需要的值作为值。

就像这样

$newArray = array_map(function($value){return array_keys($value);},$yourArray);

var_dump($newArray);

array (size=2)
  0 => 
    array (size=9)
      0 => string 'action' (length=6)
      1 => string 'id' (length=2)
      2 => string 'validate' (length=8)
      3 => string 'Base' (length=4)
      4 => string 'EBase' (length=5)
      5 => string 'Qty' (length=3)
      6 => string 'Type' (length=4)
      7 => string 'Label' (length=5)
      8 => string 'Unit' (length=4)
  1 => 
    array (size=9)
      0 => string 'action' (length=6)
      1 => string 'id' (length=2)
      2 => string 'validate' (length=8)
      3 => string 'Base' (length=4)
      4 => string 'FType' (length=5)
      5 => string 'Qty' (length=3)
      6 => string 'Type' (length=4)
      7 => string 'Label' (length=5)
      8 => string 'Unit' (length=4)

答案 8 :(得分:0)

使用此功能,您可以从多维数组中获取所有键

function arrayKeys($array, &$keys = array()) {        
        foreach ($array as $key => $value) {
            $keys[] = $key;
            if (is_array($value)) {                
                $this->arrayKeys($value, $keys);
            }
        }
        return $keys;
}

答案 9 :(得分:0)

(如果所有记录都具有相同的键),则可以执行以下操作:

$firstItem = reset($array);
$keys = array_keys($firstItem);

很明显,这不是该特定问题的正确答案,因为记录具有不同的键。但这可能是您在查找如何从所有键都相同的数组中检索二级键时发现的问题(我做到了)。如果所有记录具有相同的键,则可以简单地使用reset()使用数组中的第一项,并使用array_keys()从第一项获取键。

答案 10 :(得分:0)

我的提案,类似于this answer,但使用spread operator(PHP 5.6+)更快。

array_merge(...array_values($fields))

如果要将名称移至数组值并将键重置为0..n,只需在最后一步中使用array_keys

array_keys(array_merge(...array_values($fields)))