通过匹配子数组的键值对来合并多维数组?

时间:2017-06-30 15:42:34

标签: php arrays multidimensional-array

任务是合并(“廉价”)两个数组,这些数组具有匹配的子数组键值对。 E.g:

数组1:

Array
(
[0] => Array
    (
        [count] => 1
        [da_table] => article
        [da_class] => classes\elements\tables\Article
        [da_page_class] => Page_Article
    )

[1] => Array
    (
        [count] => 2
        [da_table] => client_contract_specification_price
        [da_class] => classes\elements\tables\ClientContractSpecificationPrice
        [da_page_class] => Page_ClientContractSpecification
    )

[2] => Array
    (
        [count] => 2
        [da_table] => supplier
        [da_class] => classes\elements\tables\Supplier
        [da_page_class] => Page_Supplier
    )

)

数组2:

Array
(
[0] => Array
    (
        [name] => Articles
        [name_short] => 
        [da_page_class] => Page_Article
    )

[1] => Array
    (
        [name] => Client contract specifications
        [name_short] => cc_specifications
        [da_page_class] => Page_ClientContractSpecification
    )

[2] => Array
    (
        [name] => Suppliers
        [name_short] => 
        [da_page_class] => Page_Supplier
    )

)

如何通过匹配[da_page_class] =>合并上述两个数组...对,因此结果数组将包含第一个和第二个数组的键值,即:

...
[0] => Array
    (
        [count] => 1
        [da_table] => article
        [da_class] => classes\elements\tables\Article
        [da_page_class] => Page_Article
        [name] => Articles
        [name_short] => 
    )
...

附加要求: 子阵列可以按随机顺序排列。此外,可能存在“孤儿”,其中包含['da_page_class']的值,但在另一个数组中不匹配。这些应该被忽略。

2 个答案:

答案 0 :(得分:2)

好吧,你只需遍历数组元素并将它们组合起来:

<?php
$data1 = [
    [
        'count' => 1,
        'da_table' => 'article',
        'da_class' => 'classes\elements\tables\Article',
        'da_page_class' => 'Page_Article'
    ],
    [
        'count' => 2,
        'da_table' => 'client_contract_specification_price',
        'da_class' => 'classes\elements\tables\ClientContractSpecificationPrice',
        'da_page_class' => 'Page_ClientContractSpecification'
    ],
    [
        'count' => 2,
        'da_table' => 'supplier',
        'da_class' => 'classes\elements\tables\Supplier',
        'da_page_class' => 'Page_Supplier'
    ]
];

$data2 = [
    [
        'name' => 'Articles',
        'name_short' => null,
        'da_page_class' => 'Page_Article'
    ],
    [
        'name' => 'Client contract specifications',
        'name_short' => 'cc_specifications',
        'da_page_class' => 'Page_ClientContractSpecification'
    ],
    [
        'name' => 'Suppliers',
        'name_short' => null,
        'da_page_class' => 'Page_Supplier'
    ]
];

$output = [];
for ($i=0; $i<count($data1); $i++) {
    $output[$i] = array_merge($data1[$i], $data2[$i]);
}
print_r($output);

输出显然是:

Array
(
    [0] => Array
        (
            [count] => 1
            [da_table] => article
            [da_class] => classes\elements\tables\Article
            [da_page_class] => Page_Article
            [name] => Articles
            [name_short] =>
        )

    [1] => Array
        (
            [count] => 2
            [da_table] => client_contract_specification_price
            [da_class] => classes\elements\tables\ClientContractSpecificationPrice
            [da_page_class] => Page_ClientContractSpecification
            [name] => Client contract specifications
            [name_short] => cc_specifications
        )

    [2] => Array
        (
            [count] => 2
            [da_table] => supplier
            [da_class] => classes\elements\tables\Supplier
            [da_page_class] => Page_Supplier
            [name] => Suppliers
            [name_short] =>
        )

)

或者,您也可以将第二个数组元素的内容合并到第一个数组的相应元素中。这减少了大型数据集的内存占用。

考虑到您在评论中指定的额外要求,我更改了合并策略以允许两组中的任意订单:

<?php
$data1 = [
    [
        'count' => 1,
        'da_table' => 'article',
        'da_class' => 'classes\elements\tables\Article',
        'da_page_class' => 'Page_Article'
    ],
    [
        'count' => 2,
        'da_table' => 'client_contract_specification_price',
        'da_class' => 'classes\elements\tables\ClientContractSpecificationPrice',
        'da_page_class' => 'Page_ClientContractSpecification'
    ],
    [
        'count' => 2,
        'da_table' => 'supplier',
        'da_class' => 'classes\elements\tables\Supplier',
        'da_page_class' => 'Page_Supplier'
    ]
];

$data2 = [
    [
        'name' => 'Articles',
        'name_short' => null,
        'da_page_class' => 'Page_Article'
    ],
    [
        'name' => 'Client contract specifications',
        'name_short' => 'cc_specifications',
        'da_page_class' => 'Page_ClientContractSpecification'
    ],
    [
        'name' => 'Suppliers',
        'name_short' => null,
        'da_page_class' => 'Page_Supplier'
    ]
];

$output = [];
array_walk($data1, function($entry, $key) use (&$output, $data2) {
    $output[$key] = $entry;
    foreach($data2 as $cand) {
        if ($entry['da_page_class'] == $cand['da_page_class']) {
            $output[$key] = array_merge($output[$key], $cand);
        }
    }
});
print_r($output);

结果输出显然与上面相同。

答案 1 :(得分:1)

O(m * n)溶液:

$result = array();

foreach ($array1 as $value1) {
    // do not handle elements without pageclass
    if (!array_key_exists('da_page_class', $value1) || !$value1['da_page_class']) {
        continue;
    }

    foreach ($array2 as $value2) {
        if (!array_key_exists('da_page_class', $value2) || !$value2['da_page_class']) {
            continue;
        }
        if ($value1['da_page_class'] == $value2['da_page_class']) {
            array_push($result, $value1 + $value2)
            break;
        }
    }
}

print_r($result);

O(m + n)溶液:

$result = array();

foreach ($array1 as $value) {
    // do not handle elements without pageclass
    if (!array_key_exists('da_page_class', $value) || !$value['da_page_class']) {
        continue;
    }
    $result[$value['da_page_class']] = $value;
}
foreach ($array2 as $value) {
    if (
        // do not handle elements without pageclass         
        !array_key_exists('da_page_class', $value) || !$value['da_page_class'] ||
        // do not handle elements that do not exist in array 1
        !array_key_exists($value['da_page_class'], $result)
        ) {
        continue;
    }
    // merge values of this pageclass
    $result[$value['da_page_class']] = array_merge($result[$value['da_page_class']], $value);
}

print_r($result);

编辑:添加O(m + n)溶液