php根据匹配的列名合并数组

时间:2019-06-11 14:58:52

标签: php arrays

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

$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);
}

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

2 个答案:

答案 0 :(得分:1)

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

我建议使用其他方法-使用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

答案 1 :(得分:1)

这分为2个步骤,首先按ID累积所有数据,还收集所有标题列。然后使用此数据创建缺少数据的空白输出数组。

代码注释...

$store = [];
$headers = [];
foreach ( $data as $set )  {
    $headerRow = array_shift($set);
    // Collect all header columns
    $headers = array_merge($headers, $headerRow);
    foreach ( $set as $index => $list ){
        // Create associative list of data so they can be combined (i.e. ID fields)
        $list = array_combine($headerRow, $list);
        // Use ID value as key and create if needed
        if ( !isset($store[$list["ID"]]) )    {
            $store[$list["ID"]] = $list;
        }
        else    {
            $store[$list["ID"]] = array_merge($store[$list["ID"]], $list);
        }
    }
}

$headers = array_unique($headers);
$output = [ 'output' => [$headers]];
// Create template array, so that missing fields will be set to null
$blank = array_fill_keys($headers, null);
foreach ( $store as $dataRow )  {
    // Fill in the fields for this ID and then change to numeric keys
    $output['output'][] = array_values(array_merge($blank, $dataRow));
}