Take the tour ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

Is there an easy way to split an array into two arrays, one consisting of all the keys and the other consisting of all the values? This would be a reverse to the action of array_combine. Is there an inbuilt function for doing such a task? Let's use an example array:

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

Is there a function that will split the above array into:

$array_keys = array('Tiger', 'Hippo', 'River');
$array_values = array('Forest', 'River', 'Sky');
share|improve this question
 
Looked up the functions, used them and they work. So all the others are correct. I guess, I will be spending time with the PHP manual or any reference book. Thanks VERY MUCH to you all. –  Bululu Jun 4 '11 at 4:57
add comment

5 Answers

up vote 12 down vote accepted

There are two functions called array_keys and array_values:

$array_keys = array_keys($array);
$array_values = array_values($array);
share|improve this answer
add comment

There are two functions actually:

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

You can also do the exact opposite:

$array = array_combine($keys, $values);
share|improve this answer
add comment

Unfortunately there is no built-in inverse of array_combine. There is also no way to define one, since array_combine expects multiple parameters and we can't return multiple values from a function.

We can construct an alternative to array_combine which takes a single argument: the array of keys and the array of values wrapped up together in another array. This transformation is called "uncurrying" and is performed by the "call_user_func_array" function:

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

This alternative function does have an inverse:

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

If we define function composition:

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

Then the following functions are all (extensionally) equal, ie. they all return their argument unchanged:

$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

Note that they accept different argument types though:

  • $identity will work on anything.
  • $left_inverse will work on any array.
  • $right_inverse will work on arrays-of-arrays, where the outer array contains 2 elements, both inner arrays are of equal length and the first inner array only contains integers and strings.
share|improve this answer
add comment

Strangely enough, the functions you're looking for are called array_keys() and array_values().

$keys = array_keys($array);
$vals = array_values($array);
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.