php根据具有多个条目或重复项的匹配列名称合并数组

时间:2019-06-12 06:18:25

标签: php arrays sorting

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

 override func prepareForReuse() {
    super.prepareForReuse()
    self.imageView.transform = CGAffineTransform.identity
 }

这是@Nigel Ren用户当前的工作答案,我在这里必须question

$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',
            )
        ),
    );

上面的代码对于上面给定的数组非常有效。

这是我需要处理的新情况:

案例1: 当数据仅包含一个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));
}
print_r($output);

在这种情况下,Nigel的答案不会同时输出相同ID的两条记录。它仅输出一条记录。 当存在具有重复ID的单个数组时的预期输出:

$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 => '101',
            1 => '786075',
            2 => '2012-09-05',
            ),
        ),
    'data2' => array (
        0 =>
        array (
            0 => 'Balance',
            1 => 'ID',
            ),
        ),
'data3' => array (
    0 =>
    array (
        0 => 'Active',
        1 => 'ID',
        ),
    ),
    );

案例2:

除第一个数组以外的任何其他数组包含多个相同ID的条目。

Array
(
    [output] => Array
        (
            [0] => Array
                (
                    [0] => ID
                    [1] => PinCode
                    [2] => Date
                )

            [1] => Array
                (
                    [0] => 101
                    [1] => 454075
                    [2] => 2012-03-03
                )

            [2] => Array
                (
                    [0] => 101
                    [1] => 786075
                    [2] => 2012-09-05
                )

        )

)

在这种情况下的预期输出:

$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 => 'Order',
            1 => 'ID',
            ),
        1 =>
        array (
            0 => 'Colgate',
            1 => '101',
            ),
        2 =>
        array (
            0 => 'Waffles',
            1 => '101',
            )
        ),
    );

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您可以通过循环获得所需的输出:

$desired_array = array();

$n_data1 = count($data['data1']);
$n_data2 = count($data['data2']);
$n_data3 = count($data['data3']);

for ($i=0; $i < $n_data1; $i++) {

 if ($n_data2 > $i) {
    foreach ($data['data2'][$i] as $key => $value) {
        if(!in_array($value,$data['data1'][$i])){
            $data['data1'][$i][]=$value;
        }
    }
 } else {
    $data['data1'][$i][]= null;
 }

}

for ($i=0; $i < $n_data1; $i++) {

 if ($n_data3 > $i) {
    foreach ($data['data3'][$i] as $key => $value) {

        if(!in_array($value,$data['data1'][$i])){
            $data['data1'][$i][]=$value;
        }
    }
 } else {
   $data['data1'][$i][]= null; 
 }
}

$desired_array = $data['data1'];