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

use*_*219 21 php arrays key multidimensional-array

我想生成一个使用的第二级密钥列表.每条记录都不包含所有相同的密钥.但我需要知道所有的密钥是什么.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
        )
)
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助!

J.C*_*cio 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);
}

?>
Run Code Online (Sandbox Code Playgroud)

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


Øys*_*sen 9

array_keys(call_user_func_array('array_merge', $a));
Run Code Online (Sandbox Code Playgroud)

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


ink*_*dmn 6

foreach($bigArray as $array){    
    foreach($array as $key=>$value){
        echo $key;
    }
}
Run Code Online (Sandbox Code Playgroud)

那应该做你想要的.


Sy *_*way 6

一个班轮:

$keys=array_unique(array_reduce(array_map('array_keys',$data),'array_merge',[]));
Run Code Online (Sandbox Code Playgroud)

或者在一个函数中:

function get_array_children_keys($data) {
    return array_unique(
        array_reduce(array_map('array_keys', $data), 'array_merge', [])
    );
}
Run Code Online (Sandbox Code Playgroud)

现在让我们用一个例子来分解它,这是一些示例数据:

[
    ['key1' => 0],
    ['key1' => 0, 'key2' => 0],
    ['key3' => 0]
]
Run Code Online (Sandbox Code Playgroud)

从最里面的函数开始,我们使用 array_keys 函数运行 array_map:

array_map('array_keys', $data)
Run Code Online (Sandbox Code Playgroud)

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

[
    ['key1'],
    ['key1', 'key2'],
    ['key3']
]
Run Code Online (Sandbox Code Playgroud)

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

array_reduce(..., 'array_merge', []);
Run Code Online (Sandbox Code Playgroud)

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

[
    'key1',
    'key1',
    'key2',
    'key3'
]
Run Code Online (Sandbox Code Playgroud)

现在我们用 array_unique 去除重复项:

array_unique(...)
Run Code Online (Sandbox Code Playgroud)

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

[
    'key1',
    'key2',
    'key3'
]
Run Code Online (Sandbox Code Playgroud)


Pas*_*TIN 5

这样的事情怎么样:

$your_keys = array_keys($your_array[0]);
Run Code Online (Sandbox Code Playgroud)

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


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

$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);
Run Code Online (Sandbox Code Playgroud)

会得到你:

array
  0 => string 'action' (length=6)
  1 => string 'id' (length=2)
  2 => string 'base' (length=4)
Run Code Online (Sandbox Code Playgroud)

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

echo implode(', ', $your_keys);
Run Code Online (Sandbox Code Playgroud)

会得到你:

action, id, base
Run Code Online (Sandbox Code Playgroud)

即,第一子阵列的键列表.