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 关注
- 91 浏览
添加回答
举报