首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用来构造数组的JavaScript扩展语法在PHP中的等价物是什么?

用来构造数组的JavaScript扩展语法在PHP中的等价物是什么?
EN

Stack Overflow用户
提问于 2018-10-23 05:23:39
回答 3查看 1.4K关注 0票数 5

我已经问过一个关于将函数从Ruby转换到JS的question,现在我正在尝试实现JS到PHP,但有些东西不起作用,告诉我我遗漏了什么?

JS上的代码:

代码语言:javascript
复制
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中这样做:

代码语言:javascript
复制
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行上

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-23 05:34:57

在PHP版本中,您不需要使用...操作符。您只需要将移位的行与递归调用的结果合并。

代码语言:javascript
复制
function f($a)
{
    return (count($a) === 0) 
    ? [] 
    : array_merge(
        array_shift($a), 
        f(array_reverse(transpose($a)))
    );
}

代码语言:javascript
复制
array_merge(array_shift($a), f(array_reverse(transpose($a))))

和这里发生的事情是一样的:

代码语言:javascript
复制
[...a.shift(), ...f(transpose(a).reverse())]

...在JS中扩展了数组的元素。它在PHP中的工作原理类似,但在这里它只在函数定义或调用中有效。

票数 4
EN

Stack Overflow用户

发布于 2018-10-23 05:31:56

在PHP中,您的... (也称为"splat")运算符与JS中的位置不同。

此外,在PHP7.4之前,splat运算符不能用于数组文字,只能用于函数调用。在f()函数中的用法等同于array_merge()

代码语言:javascript
复制
function f($a)
{
    return (count($a) === 0) 
    ? [] 
    : array_merge(
        array_shift($a), 
        f(array_reverse(transpose($a)))
    );
}

DEMO

票数 3
EN

Stack Overflow用户

发布于 2018-10-23 05:31:28

您的array_shift参数太多..您所需要的就是与array_reverse相同的$a

代码语言:javascript
复制
<?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]]));

结果

代码语言:javascript
复制
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
                                        (
                                        )

                                )

                        )

                )

        )

)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52937948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档