Я хочу создать список второго уровня используемых ключей. Каждая запись не содержит всех одинаковых клавиш. Но мне нужно знать, что у всех ключей. array_keys () не работает, он возвращает только список чисел.
По сути, вывод Im ищет:
действие, 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 ) )
Спасибо за помощь!
<?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 ()
array_keys(call_user_func_array('array_merge', $a));
Объедините все значения и извлеките полученные ключи.
foreach($bigArray as $array){ foreach($array as $key=>$value){ echo $key; } }
Это должно делать то, что вы хотите.
Что-то вроде этого:
$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
т.е. список ключей первой подматрицы.
Один лайнер:
$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' ]
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; }
попробуйте эту функцию. Он вернется, как вы хотите.
Возможно, вы можете использовать функцию 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)
С помощью этой функции вы можете получить все ключи из многомерного массива
function arrayKeys($array, &$keys = array()) { foreach ($array as $key => $value) { $keys[] = $key; if (is_array($value)) { $this->arrayKeys($value, $keys); } } return $keys; }