Подтвердить что ты не робот

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

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

По сути, вывод Im ищет:

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

$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

Один вкладыш:

$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'
]

Ответ 6

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;
    }

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

Ответ 7

В то время как ответы @raise предоставляют ярлык, он терпит неудачу с помощью цифровых клавиш. Следующее должно решить следующее:

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

Только если все записи имеют одинаковые ключи, это можно сделать:

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

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

Ответ 11

Мое предложение аналогично этому ответу, но быстрее и использует оператор распространения (PHP 5. 6+).

array_merge(...array_values($fields))

если вы хотите переместить имена в значения массивов и сбросить ключи до 0..n, просто используйте array_keys на последнем шаге.

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