PHP Разбиение массива на два массива – массив массивов и значений ключей

Есть ли простой способ разбить массив на два массива, один из которых состоит из всех ключей, а другой состоит из всех значений? Это будет обратным действию array_combine. Есть ли встроенная функция для выполнения такой задачи? Давайте используем массив примеров:

$array = array('Tiger' => 'Forest', 'Hippo' => 'River', 'Bird' => 'Sky'); 

Есть ли функция, которая будет разбивать вышеупомянутый массив на:

 $array_keys = array('Tiger', 'Hippo', 'Bird'); $array_values = array('Forest', 'River', 'Sky'); 

Существуют две функции, называемые array_keys и array_values :

 $array_keys = array_keys($array); $array_values = array_values($array); 

На самом деле есть две функции:

 $keys = array_keys($array); $values = array_values($array); 

Вы также можете сделать абсолютно противоположное:

 $array = array_combine($keys, $values); 

использовать array_keys и array_values

К сожалению, нет встроенного инвертора array_combine. Также нет способа определить его, поскольку array_combine ожидает несколько параметров, и мы не можем вернуть несколько значений из функции.

Мы можем построить альтернативу array_combine, которая принимает один аргумент: массив ключей и массив значений, объединенных в другой массив. Это преобразование называется «неуправляемым» и выполняется функцией «call_user_func_array»:

 $array_comb = function($arr) { return call_user_func_array('array_combine', $arr); }; 

Эта альтернативная функция имеет обратную:

 $array_split = function($arr) { return array(array_keys($arr), array_values($arr)); }; 

Если мы определим состав функции:

 $compose = function($f, $g) { return function($x) use ($f, $g) { return $f($g($x)); }; }; 

Тогда следующие функции (по-прежнему) равны, т. Е. все они возвращают свой аргумент без изменений:

 $identity = function($x) { return $x; }; $left_inverse = $compose($array_split, $array_comb); // Split then combine $right_inverse = $compose($array_comb, $array_split); // Combine then split 

Обратите внимание, что они принимают разные типы аргументов:

  • $ identity будет работать на что угодно.
  • $ left_inverse будет работать на любом массиве.
  • $ right_inverse будет работать на массивах массивов, где внешний массив содержит 2 элемента, оба внутренних массива имеют одинаковую длину, а первый внутренний массив содержит только целые числа и строки.

Как ни странно, функции, которые вы ищете, называются array_keys() и array_values() .

 $keys = array_keys($array); $vals = array_values($array); 
 function array_split($data) { $x = 0;//Counter to ensure accuracy $retArray[0] = array();//Array of Keys $retArray[1] = array();//Array of Values foreach($data as $key => $value) { $retArray[0][$x] = $key; $retArray[1][$x] = $value; $x++; } RETURN $retArray; } $data = array("key" => "value", "key2" => "value2"); $splitData = array_split($data); //print_r($splitData[0]);//Output: Array ( [0] => key [1] => key2 ) //print_r($splitData[1]);//Output: Array ( [0] => value [1] => value2 ) print_r($splitData); //Output: /* Array ( [0] => Array ( [0] => key [1] => key2 ) [1] => Array ( [0] => value [1] => value2 ) ) */