2 回答

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>";
}

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
- 2 回答
- 0 關注
- 113 瀏覽
添加回答
舉報