Найти все ключи второго уровня в многомерном массиве в php - PullRequest
21 голосов
/ 21 сентября 2009

Я хочу сформировать список ключей второго уровня, используемых. Каждая запись не содержит все одинаковые ключи. Но мне нужно знать, что это за ключи. 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
        )
)

Спасибо за помощь!

Ответы [ 9 ]

20 голосов
/ 21 сентября 2009
<?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);
}

?>

edit: удалена лишняя функция array_reverse ()

9 голосов
/ 21 сентября 2009
array_keys(call_user_func_array('array_merge', $a));

Объединить все значения и получить полученные ключи.

6 голосов
/ 21 сентября 2009
foreach($bigArray as $array){    
    foreach($array as $key=>$value){
        echo $key;
    }
}

Это должно делать то, что вы хотите.

5 голосов
/ 21 сентября 2009

Что-то вроде этого:

$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 голосов
/ 21 июля 2015

Один лайнер:

$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_map с функцией array_keys:

array_map('array_keys', $data)

Это дает нам ключи от всех дочерних массивов

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

Затем мы запускаем array_reduce для данных с обратным вызовом array_merge и пустым массивом в качестве исходного значения:

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

Это преобразует наши множественные массивы в 1 плоский массив:

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

Теперь мы удалим наши дубликаты с помощью array_unique:

array_unique(...)

И в итоге все наши ключи:

[
    'key1',
    'key2',
    'key3'
]
1 голос
/ 19 января 2018

Хотя @raise answers предоставляет ярлык, он не работает с цифровыми клавишами. Это должно решить следующее:

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

array_map('array_keys',$a): цикл при получении ключей

...'array_merge'...: объединить массив ключей

array_unique(...: (необязательно) Получить уникальные ключи.

Надеюсь, это кому-нибудь поможет.

UPDATE:

В качестве альтернативы вы можете использовать

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

Это дает тот же ответ, что и выше, и намного быстрее.

1 голос
/ 30 августа 2010
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;
    }

попробуйте эту функцию. Он вернется, как вы хотите.

0 голосов
/ 07 сентября 2016

С помощью этой функции вы можете получить все ключи из многомерного массива

function arrayKeys($array, &$keys = array()) {        
        foreach ($array as $key => $value) {
            $keys[] = $key;
            if (is_array($value)) {                
                $this->arrayKeys($value, $keys);
            }
        }
        return $keys;
}
0 голосов
/ 17 июня 2013

Возможно, вы можете использовать функцию 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)
...