PHP Splitting an Array into two arrays - keys array and values array

后端 未结 6 1442
夕颜
夕颜 2020-12-14 08:52

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

6条回答
  •  盖世英雄少女心
    2020-12-14 09:42

    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.

提交回复
热议问题