将PHP数组拆分为两个数组-键数组和值数组

20

有没有一种简单的方法将一个数组拆分成两个数组,一个由所有键组成,另一个由所有值组成? 这将是array_combine操作的反向。 是否有内置函数可以执行此任务? 我们使用一个示例数组:

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

是否有一个函数可以将上述数组分割为:

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

查阅了这些函数,使用它们并且它们能够正常工作。所以其他的都是正确的。我想我会花时间去看 PHP 手册或者任何参考书。非常感谢你们所有人。 - Bululu
6个回答

39

有两个函数分别叫做array_keysarray_values

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

4
分离后,键和值之间的顺序是否在任何源数组中完全相同? - datasn.io
我相信如此。对于array_values,php文档明确说明“array_values()返回数组中的所有值并将数组数字化索引”。截至2017年12月28日,我没有看到array_keys有这样明确的说明。然而,在php网站的用户贡献注释中,使用array_keys两次来获取元素的位置(由vesely at tana dot it贡献)暗示array_keys以类似于array_values的方式返回关键元素。 - KolaB

9

实际上有两个函数:

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

您也可以做完全相反的事情:
$array = array_combine($keys, $values);

4

3

奇怪的是,你要找的函数叫做array_keys()array_values()

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

2

很不幸,PHP中没有内置的array_combine函数的反函数。我们也无法定义一个反函数,因为array_combine函数期望多个参数,而我们无法从函数中返回多个值。

我们可以构建一个另类的array_combine函数,它只接受一个参数:将键数组和值数组打包在另一个数组中。这种转换称为“uncurrying”,可以通过“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 个元素,内部数组长度相等且第一个内部数组仅包含整数和字符串。

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

)
*/

你应该解释你的答案,而不仅仅是粘贴代码。 - TResponse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接