2011-06-04 88 views
12

是否有一种简单的方法将数组拆分为两个数组,一个由所有键组成,另一个由所有值组成?这将与array_combine的操作相反。是否有内置的功能来完成这样的任务? 让我们用一个例子数组:PHP将数组拆分为两个数组 - 键数组和数组

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

有没有将拆分上述阵列成一个函数:

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

查了一下函数,使用它们和它们的工作。所有其他人都是正确的。我想,我会花时间在PHP手册或任何参考书上。非常感谢你们。 – Bululu 2011-06-04 04:57:13

回答

27

有两个函数调用array_keysarray_values

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

但它们在分离后的键和值之间的绝对顺序是否相同?对于任何源阵列? – 2014-01-13 12:50:51

+0

我相信如此。对于array_values,php文档显式声明'* array_values()返回数组中的所有值并以数字索引*'。截至2017年12月28日,我没有看到array_keys的明确声明。但是,在php网站上的帮助文本之后的用户贡献注释中,使用array_keys两次获取元素的位置(由* vesely在tana dot *提供)意味着array_keys以类似的方式返回键元素array_values。 – KolaB 2017-12-28 17:02:27

6

有两个函数实际上是:

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

你也可以做正好相反:

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

奇怪的是,你正在寻找的功能被称为array_keys()array_values()

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

不幸的是,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 

注意,他们接受不同的参数类型,但:

  • $身份将在任何工作。
  • $ left_inverse将适用于任何阵列。
  • $ right_inverse可用于阵列数组,其中外部数组包含2个元素,两个内部数组长度相等,第一个内部数组仅包含整数和字符串。
0
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 
     ) 

) 
*/ 
+0

你应该解释你的答案,而不是只是粘贴代码 – 2015-02-15 09:31:23