it-swarm.com.ru

Найти все ключи второго уровня в многомерном массиве в php

Я хочу создать список ключей второго уровня, используемых. Каждая запись не содержит все одинаковые ключи. Но мне нужно знать, что это за ключи. array_keys () не работает, он только возвращает список чисел.

По сути, результат, который я ищу:

действие, идентификатор, проверка, база, Ebase, Ftype, кол-во, тип, метка, единица измерения

У меня есть большой многомерный массив, который следует формату:

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
        )
)

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

19
user103219
<?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 ()

19
J.C. Inacio
array_keys(call_user_func_array('array_merge', $a));

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

9
Øystein Riiser Gundersen
foreach($bigArray as $array){    
    foreach($array as $key=>$value){
        echo $key;
    }
}

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

6
inkedmn

Как насчет чего-то вроде этого:

$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

т.е. список ключей первого подмассива.

5
Pascal MARTIN

Один лайнер:

$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'
]
4
Sy Holloway
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;
    }

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

1
kinderjit singh

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

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

Хотя @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(...: (необязательно) Получить уникальные ключи.

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

Обновление:

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

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

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

0
McAngujo

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