我已经问过一个关于将函数从Ruby转换到JS的question,现在我正在尝试实现JS到PHP,但有些东西不起作用,告诉我我遗漏了什么?
JS上的代码:
function transpose(a) {
return a.length === 0 ? a : a[0].map((col, i) => a.map((row) => row[i]))
}
function f(a) {
return a.length === 0 ? [] : [...a.shift(), ...f(transpose(a).reverse())];
}
console.log(f([[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]))
在PHP中这样做:
function transpose($array)
{
if (count($array) === 0) return $array;
foreach ($array as $rowkey => $row)
{
foreach($row as $colkey => $col)
{
$out[$colkey][$rowkey] = $col;
}
}
return $out;
}
function f($a)
{
return (count($a) === 0)
? []
: [
array_shift(...$a),
f(array_reverse(transpose(...$a)))
];
}
print_r(f([[1,2,3,4],[10,11,12,5],[9,8,7,6]]));
有问题吗?错误:
警告: array_shift()只需要1个参数,在...中给出了3个参数...在第24行
为中的foreach()提供的参数无效...在第10行
警告:为中的foreach()提供的参数无效...在第10行
警告:为中的foreach()提供的参数无效...在第10行
警告:为中的foreach()提供的参数无效...在第10行
注意:未定义变量: out in ...在第16行
警告: array_reverse()要求参数%1为数组,在...中给出了null ...第25行警告: count():参数必须是在...中实现Countable的数组或对象在第21行上
发布于 2018-10-23 05:34:57
在PHP版本中,您不需要使用...
操作符。您只需要将移位的行与递归调用的结果合并。
function f($a)
{
return (count($a) === 0)
? []
: array_merge(
array_shift($a),
f(array_reverse(transpose($a)))
);
}
array_merge(array_shift($a), f(array_reverse(transpose($a))))
和这里发生的事情是一样的:
[...a.shift(), ...f(transpose(a).reverse())]
...
在JS中扩展了数组的元素。它在PHP中的工作原理类似,但在这里它只在函数定义或调用中有效。
发布于 2018-10-23 05:31:56
在PHP中,您的...
(也称为"splat")运算符与JS中的位置不同。
此外,在PHP7.4之前,splat运算符不能用于数组文字,只能用于函数调用。在f()
函数中的用法等同于array_merge()
。
function f($a)
{
return (count($a) === 0)
? []
: array_merge(
array_shift($a),
f(array_reverse(transpose($a)))
);
}
发布于 2018-10-23 05:31:28
您的array_shift
参数太多..您所需要的就是与array_reverse
相同的$a
<?php
function transpose($array)
{
if (count($array) === 0) return $array;
foreach ($array as $rowkey => $row)
{
foreach($row as $colkey => $col)
{
$out[$colkey][$rowkey] = $col;
}
}
return $out;
}
function f($a)
{
return (count($a) === 0)
? []
: [
array_shift($a),
f(array_reverse(transpose($a)))
];
}
print_r(f([[1,2,3,4],[10,11,12,5],[9,8,7,6]]));
结果
Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
)
[1] => Array
(
[0] => Array
(
[0] => 5
[1] => 6
)
[1] => Array
(
[0] => Array
(
[0] => 7
[1] => 8
[2] => 9
)
[1] => Array
(
[0] => Array
(
[0] => 10
)
[1] => Array
(
[0] => Array
(
[0] => 11
[1] => 12
)
[1] => Array
(
)
)
)
)
)
)
https://stackoverflow.com/questions/52937948
复制相似问题