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

Php 如何展平和输出两个多维数组并打印成对值的组合?,php,Php,我有两个输入阵列: $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 =&

我有两个输入阵列:

$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 0
0 1
0 5
0 4
0 8
0 0
4 0
4 1
4 5
4 4
4 8
4 0
8 0
8 1
8 5
8 4
8 8
8 0
0 0
0 1
0 5
0 4
0 8
0 0
2 0
2 1
2 5
2 4
2 8
2 0
6 0
6 1
6 5
6 4
6 8
6 0
10 0
10 1
10 5
10 4
10 8
10 0
1 0
1 1
1 5
1 4
1 8
1 0
5 0
5 1
5 5
5 4
5 8
5 0
3 0
3 1
3 5
3 4
3 8
3 0
7 0
7 1
7 5
7 4
7 8
7 0
11 0
11 1
11 5
11 4
11 8
11 0

如何修改代码以显示所有组合?

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


foreach($data1作为$sourcevalue){
if(是_数组($sourcevalue)){
foreach($sourcevalue作为$value){
打印数据2(价值);
}
}否则{
printData2($sourcevalue);
}
}
函数printData2($source){
foreach($data2作为$endvalue){
if(是_数组($endvalue)){
foreach($endvalue作为$value1){
pr(来源:$value1);
}
}否则{
pr(来源:$endvalue);
}
}
}
功能pr($source,$end){
回显“{$source}{$end}
”; }

在处理过程中,数组2中的数据永远不会更改,因此最好准备/展平数据,以避免在迭代嵌套循环时重复
is\u array()
调用

一种方法是使用
array\u merge\u recursive()
仅访问叶节点(不可编辑)并生成一维数组(
$flat2

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

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

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

注意,我将根据您的请求,在Justinas的回答中包含来自
$data1
的第一级密钥

代码:()


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

代码:()

输出:

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

最糟糕的比较是数组($endvalue)=“1”
是数组已返回布尔值,无需转换为字符串!你能解释一下你想做什么吗?由于您只输出内部数组中的最后一个元素,所以之前的任何值都将被覆盖且从不使用您在foreach内部执行foreach,并且每次循环时都执行
$end=$value1
,因此您只需擦除前面的值并放入最后一个。每次获得新值时添加一些回显I get error调用未定义的函数printData2()我的缺点是我把功能部件放在isset按钮里面,所以war得到eoor…当我把它放在外面的时候,它工作得非常好…谢谢你much@Justinas我怎样才能为每个人都拿到钥匙呢value@Justinas当值的键为1=>8时,我怎样才能把它的键也拉出来呢?那么,我怎样把1拉到一个variable@angel
foreach($data1作为$key=>$value)
$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);
        }
    }
}
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