亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何展平和輸出兩個多維數組并打印成對值的組合?

如何展平和輸出兩個多維數組并打印成對值的組合?

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 關注
  • 113 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號