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

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

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

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

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

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

Ответ 1

Есть две функции, называемые array_keys и array_values ​​:

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

Ответ 2

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

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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
        )

)
*/