Cal*_*vin 68 php arrays higher-order-functions
你如何在PHP中翻转90度(转置)多维数组?例如:
// Start with this array
$foo = array(
'a' => array(
1 => 'a1',
2 => 'a2',
3 => 'a3'
),
'b' => array(
1 => 'b1',
2 => 'b2',
3 => 'b3'
),
'c' => array(
1 => 'c1',
2 => 'c2',
3 => 'c3'
)
);
$bar = flipDiagonally($foo); // Mystery function
var_dump($bar[2]);
// Desired output:
array(3) {
["a"]=>
string(2) "a2"
["b"]=>
string(2) "b2"
["c"]=>
string(2) "c2"
}
Run Code Online (Sandbox Code Playgroud)
你会如何实施flipDiagonally()
?
编辑:这不是作业.我只是想看看是否有任何SOers比最明显的路线更具创造性的解决方案.但是,由于一些人抱怨这个问题太容易了,那么一个适用于第 n 维数组的更通用的解决方案呢?
即如何编写函数以便:
$foo[j][k][...][x][y][z] = $bar[z][k][...][x][y][j]
Run Code Online (Sandbox Code Playgroud)
?(ps.for loops
在这种情况下,我不认为12嵌套是最好的解决方案.)
Cod*_*ler 242
function transpose($array) {
array_unshift($array, null);
return call_user_func_array('array_map', $array);
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您使用的是PHP 5.6或更高版本:
function transpose($array) {
return array_map(null, ...$array);
}
Run Code Online (Sandbox Code Playgroud)
OIS*_*OIS 62
有2个循环.
function flipDiagonally($arr) {
$out = array();
foreach ($arr as $key => $subarr) {
foreach ($subarr as $subkey => $subvalue) {
$out[$subkey][$key] = $subvalue;
}
}
return $out;
}
Run Code Online (Sandbox Code Playgroud)
我认为你指的是数组转置(列成为行,行成为列).
这是一个为你做的功能(来源):
function array_transpose($array, $selectKey = false) {
if (!is_array($array)) return false;
$return = array();
foreach($array as $key => $value) {
if (!is_array($value)) return $array;
if ($selectKey) {
if (isset($value[$selectKey])) $return[] = $value[$selectKey];
} else {
foreach ($value as $key2 => $value2) {
$return[$key2][$key] = $value2;
}
}
}
return $return;
}
Run Code Online (Sandbox Code Playgroud)