很不幸,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);
$right_inverse = $compose($array_comb, $array_split);
请注意,它们接受不同类型的参数:
- $identity 可以用于任何类型。
- $left_inverse 可以用于任何数组。
- $right_inverse 只能用于数组的数组,其中外部数组包含 2 个元素,内部数组长度相等且第一个内部数组仅包含整数和字符串。