繁体   English   中英

用于构造数组的 JavaScript 展开语法的 PHP 等价物是什么?

[英]What is the PHP equivalent of JavaScript spread syntax for constructing an array?

问已经是一个问题,关于在Ruby转换功能,JS,现在我想用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 行的 [...][...] 中给出

为第 10 行 [...][...] 中的 foreach() 提供的参数无效

警告:为第 10 行 [...][...] 中的 foreach() 提供的参数无效

警告:为第 10 行 [...][...] 中的 foreach() 提供的参数无效

警告:为第 10 行 [...][...] 中的 foreach() 提供的参数无效

注意:未定义变量:第 16 行的 [...][...] 中的 out

警告:array_reverse() 期望参数 1 是数组,在第 25 行的 [...][...] 中给出 null 警告:count():参数必须是数组或在 [... ][...] 在第 21 行

您不需要在 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 中的工作方式类似,但在这里它只在函数定义或调用中有效。

您在 PHP 中的... (又名“splat”)运算符与 JS 中的位置不同。

此外,在 PHP 7.4 之前,splat 运算符不能用于数组文字,只能用于函数调用。 f()函数中的使用等效于array_merge()

function f($a)
{
    return (count($a) === 0) 
    ? [] 
    : array_merge(
        array_shift($a), 
        f(array_reverse(transpose($a)))
    );
}

演示

你的array_shift有太多参数.. 你需要的只是$aarray_reverse相同

<?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
                                        (
                                        )

                                )

                        )

                )

        )

)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM