为了账号安全,请及时绑定邮箱和手机立即绑定

如何展平和输出两个多维数组并打印成对值的组合?

如何展平和输出两个多维数组并打印成对值的组合?

PHP
LEATH 2023-04-02 11:21:02
我有 2 个输入数组:$data1 = array (    0 => 0,    1 => array ( 0 => 4, 1 => 8, ),    2 => 0,    3 => array ( 0 => 2, 1 => 6, 2 => 10, ),    4 => array ( 0 => 1, 1 => 5, ),    5 => array ( 0 => 3, 1 => 7, 2 => 11, ),)$data2 = array (    0 => 0,    1 => array ( 0 => 1, 1 => 5, ),    2 => array ( 0 => 4, 1 => 8, ),    3 => 0,)从第一个数组读取叶节点时,我的意思是迭代第二个数组的所有叶节点并打印所有配对组合。我的问题是,只有子数组中的最后一个值$data1被打印,并且只有最后一个值$data2被打印。我的代码:foreach ($data1 as $sourcevalue){    if( is_array($sourcevalue) == "1")    {        foreach ($sourcevalue as $value)        {            $source=$value;        }    }    else     {        $source=$sourcevalue;    }    foreach ($data2 as $endvalue){        if( is_array($endvalue) == "1")        {            foreach ($endvalue as $value1){                $end=$value1;            }        }        else         {            $end=$endvalue;        }    }    echo $source." ".$end."<br>";   }我目前的输出:0 08 00 010 05 011 0期望的输出:0 00 10 50 40 80 04 04 14 54 44 84 08 08 18 58 48 88 00 00 10 50 40 80 02 02 12 52 42 82 06 06 16 56 46 86 010 010 110 510 410 810 01 01 11 51 41 81 05 05 15 55 45 85 03 03 13 53 43 83 07 07 17 57 47 87 011 011 111 511 411 811 0我如何修改我的代码以显示所有组合?
查看完整描述

2 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

您也需要回显中间元素,而不仅仅是最后一个



foreach ($data1 as $sourcevalue){

    if (is_array($sourcevalue)) {

        foreach ($sourcevalue as $value) {

            printData2($value);

        }

    } else {

        printData2($sourcevalue);

    }

}


function printData2($source) {

    foreach ($data2 as $endvalue){

        if (is_array($endvalue)){

            foreach ($endvalue as $value1){

                pr($source, $value1);

            }

        } else  {

            pr($source, $endvalue);

        }

    }

}


function pr($source, $end) {

    echo "{$source} {$end}<br>";

}


查看完整回答
反对 回复 2023-04-02
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

数组 2 中的数据在处理过程中永远不会改变,因此最好准备/展平数据以避免is_array()在迭代嵌套循环时进行冗余调用。


这样做的一种方法是使用array_merge_recursive()仅访问叶节点(不可迭代)并生成一维数组 ( $flat2)。


另一个好技巧是将元素(无论它们是否可迭代)转换为数组,而不是在is_array()迭代时进行调用。$data1如果将不可迭代元素 ( $e) 转换为数组,它将成为新数组中的唯一值。换句话说,$e变成了[$e]。


这两个步骤对清理代码大有帮助。


在我下面的代码片段中,使用两个 foreach 循环遍历$data1,然后使用第三个循环迭代$flat2,最后使用printf()干净地格式化和输出数据。


$data1请注意,我在 Justinas 的回答下根据您的要求包括了第一级密钥。


代码:(演示)


$flat2 = [];

array_walk_recursive($data2, function($v) use(&$flat2) {

    $flat2[] = $v;

});


foreach ($data1 as $k => $e) {

    foreach ((array)$e as $v) {

        foreach ($flat2 as $f) {

            printf("%d: %d %d\n", $k, $v, $f);

        }

    }

}

或者仅使用语言构造,您可以对两个数组使用相同的数组转换技术,并将第二组嵌套循环嵌套在第一组嵌套循环中。这样会生成更少的变量,少调用1次函数,更简洁。


代码:(演示)


foreach ($data1 as $k => $e1) {

    foreach ((array)$e1 as $v1) {

        foreach ($data2 as $e2) {

            foreach ((array)$e2 as $v2) {

                printf("%d: %d %d\n", $k, $v1, $v2);

            }

        }

    }

}

输出:


0: 0 0

0: 0 1

0: 0 5

0: 0 4

0: 0 8

0: 0 0

1: 4 0

1: 4 1

1: 4 5

1: 4 4

1: 4 8

1: 4 0

1: 8 0

1: 8 1

1: 8 5

1: 8 4

1: 8 8

1: 8 0

2: 0 0

2: 0 1

2: 0 5

2: 0 4

2: 0 8

2: 0 0

3: 2 0

3: 2 1

3: 2 5

3: 2 4

3: 2 8

3: 2 0

3: 6 0

3: 6 1

3: 6 5

3: 6 4

3: 6 8

3: 6 0

3: 10 0

3: 10 1

3: 10 5

3: 10 4

3: 10 8

3: 10 0

4: 1 0

4: 1 1

4: 1 5

4: 1 4

4: 1 8

4: 1 0

4: 5 0

4: 5 1

4: 5 5

4: 5 4

4: 5 8

4: 5 0

5: 3 0

5: 3 1

5: 3 5

5: 3 4

5: 3 8

5: 3 0

5: 7 0

5: 7 1

5: 7 5

5: 7 4

5: 7 8

5: 7 0

5: 11 0

5: 11 1

5: 11 5

5: 11 4

5: 11 8

5: 11 0



查看完整回答
反对 回复 2023-04-02
  • 2 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信