首页 > 解决方案 > php根据匹配的列名合并数组

问题描述

我有一个这样的数组数组:

$data = array (
    'data1' => array (
        0 => 
        array (
            0 => 'ID',
            1 => 'PinCode',
            2 => 'Date',
            ),
        1 => 
        array (
            0 => '101',
            1 => '454075',
            2 => '2012-03-03',
            ),
        2 => 
        array (
            0 => '103',
            1 => '786075',
            2 => '2012-09-05',
            ),
        ),
    'data2' => array (
        0 => 
        array (
            0 => 'Balance',
            1 => 'ID',
            ),
        1 => 
        array (
            0 => '4533',
            1 => '101',
            )
        ),
    'data3' => array (
        0 => 
        array (
            0 => 'Active',
            1 => 'ID',
            ),
        1 => 
        array (
            0 => 'Yes',
            1 => '101',
            ),
        2 => 
        array (
            0 => 'No',
            1 => '103',
            )
        ),
    );

在 $data 数组中有三个数组,分别命名为 data1、data2 和 data3。在每个数组中,第一行是列的名称,其余行是这些列的值(把它想象成一个表)。在每个 data1、data2 和 data3 中,第一行包含一个名为 ID 的列。

我想根据匹配的 ID 字段检查所有三个数组,以便最终输出数组如下所示:

期望的输出:

$output = 
array (
    'output' => 
    array (
        0 => 
        array (
            0 => 'ID',
            1 => 'PinCode',
            2 => 'Date',
            3 => 'Balance',
            4 => 'Active',
            ),
        1 => 
        array (
            0 => '101',
            1 => '454075',
            2 => '2012-03-03',
            3 => '4533',
            4 => 'Yes',
            ),
        2 => 
        array (
            0 => '103',
            1 => '786075',
            2 => '2012-09-05',
            3 => 'null',
            4 => 'No',
            ),
        )
    );

我试过的(只是尝试结合data1和data2):

$d1=$data['data1'];
$d2=$data['data2'];
if(count($d1)>count($d2))
{
    $arr1=array();
    $arr2=array();
    $arr3=array();
    $column1=$d1[0];
    $column2=$d2[0];

    for($i=1;$i<=(count($d1)-1);$i++)
    {
        if($i<count($d2))
            $arr2[]=array_combine($column2,$d2[$i]);
        else
            $arr2[]=array_combine($column2,array('0'=>'','1'=>''));
    }

    for($i=1;$i<=(count($d1)-1);$i++)
    {
        $arr1[]=array_combine($column1,$d1[$i]);
    }
    for($i=0;$i<=(count($arr1)-1);$i++)
    {
        $arr3[]=array_merge($arr1[$i],$arr2[$i]);
    }
    print_r($arr3);
}

我需要有关合并任意数量数组的简洁代码的帮助。如何获得我上面提到的输出?

标签: phparrays

解决方案


将键作为数组的第一个元素并不是一个好习惯——这就是为什么要使用键。

我推荐不同的方法 - 使用array-combine连接它们并使用 ID 作为键:

foreach($data as $v) {
    $keys = array_shift($v); // take the keys
    foreach($v as &$e) {
        $e = array_combine($keys, $e); // combine the keys and the value

        // add or append them according the ID
        if (!isset($res[$e['ID']])) $res[$e['ID']] = $e;
        else $res[$e['ID']] = array_merge($res[$e['ID']], $e);
    }
}

现在你可以接受这个——如果你必须把它转换回你的结构。

现场示例:3v4l


推荐阅读