Объединить два массива, первый на основе значения, а второй на основе ключа - php

у меня есть два массива

Первый массив с именем «$periods» и второй массив с именем «$groupExport», как показано ниже.

Первый массив — $periods

Array
(
    [0] => 201308
    [1] => 201309
    [2] => 201310
)

Второй массив — $groupExport

Array
(
    [0] => Array
        (
            [GroupCode] => 111
            [GroupDesc] => Crop Production
            [201308] => 1.5500
            [201309] => 240.4200
            [201310] => 41.2110
        )

    [1] => Array
        (
            [GroupCode] => 112
            [GroupDesc] => Animal Production
            [201309] => 3.1800
        )

    [2] => Array
        (
            [GroupCode] => 115
            [GroupDesc] => Agriculture, Forestry Support
            [201308] => 234.0400
            [201310] => 343.0200
        )
)

Я пробовал по крайней мере 5-6 разных идей кода, это не дает приведенного ниже результата. Мне нужен вывод, как показано ниже, чтобы я мог отображать набор результатов в формате таблицы в соответствии с заголовком GroupCode, GroupDesc, 201308, 201309 и 201310. Может ли кто-нибудь помочь мне решить эту проблему?

Выход

Array
(
    [0] => Array
        (
            [GroupCode] => 111
            [GroupDesc] => Crop Production
            [201308] => 1.5500
            [201309] => 240.4200
            [201310] => 41.2110
        )

    [1] => Array
        (
            [GroupCode] => 112
            [GroupDesc] => Animal Production
            [201308] => 0
            [201309] => 3.1800
            [201310] => 0
        )

    [2] => Array
        (
            [GroupCode] => 115
            [GroupDesc] => Agriculture, Forestry Support
            [201308] => 234.0400
            [201309] => 0
            [201310] => 343.0200
        )
)

person Vinayagam    schedule 07.04.2014    source источник
comment
Где код, который вы безуспешно пробовали?   -  person crush    schedule 07.04.2014


Ответы (2)


Перебирайте массив $groupExport и на каждой итерации перебирайте подмассив и проверяйте, существует ли каждый индекс периода. Если это не так, инициализируйте их 0.

foreach ($groupExport as & $export) {
    foreach ($periods as $period) {
        if (!isset($export[$period])) {
            $export[$period] = 0;
        }
    }
}

Обратите внимание на & перед $export. Это означает, что мы передаем массив по ссылке — он изменяет $groupExport на каждой итерации.

Демо

person Amal Murali    schedule 07.04.2014
comment
Спасибо за ответ, он работает так, как я ожидал. Если периоды должны быть только в порядке возрастания 201308, 201309, 201310, значит, как изменить этот рабочий код? - person Vinayagam; 07.04.2014
comment
@Vinayagam Я не уверен, зачем это нужно, но если вы хотите заказать по ключам, используйте ksort(). Добавление строки ksort($export) в качестве последней строки перед концом внешнего цикла foreach должно помочь. - person Darragh Enright; 07.04.2014
comment
Преимущество этого подхода заключается в том, что он не изменяет исходный массив. - person crush; 07.04.2014

Примечание. Это изменит исходный массив. Если вы хотите создать новый массив, лучше подойдет решение @AmalMurali.

Вот альтернативное решение, использующее некоторые встроенные функции PHP:

$keys = array_fill_keys($periods, 0);
array_walk($groupExport, function (&$item, $key, $keys) {
    $item += $keys;
}, $keys);

Вот демонстрация на IDEOne.com.


Объяснение

$keys = array_fill_keys($periods, 0);

Это преобразует ваш массив периодов в новый массив, где значение из исходного массива теперь является ключом, а значение равно 0.

array_walk($groupExport, function (&$item, $key, $keys) {
    $item += $keys;
}, $keys);

Мы проходим по каждому элементу массива $groupExport и применяем функцию к каждому члену. Мы передаем каждый элемент массива как ссылку на нашу пользовательскую функцию, что позволяет нам управлять им напрямую.

Наконец, мы добавляем $keys к $item, что по существу объединяет два массива при сохранении ключевых ассоциаций.

Выход

Array
(
    [0] => Array
        (
            [GroupCode] => 111
            [GroupDesc] => Crop Production
            [201308] => 1.55
            [201309] => 240.42
            [201310] => 41.211
        )

    [1] => Array
        (
            [GroupCode] => 112
            [GroupDesc] => Animal Production
            [201309] => 3.18
            [201308] => 0
            [201310] => 0
        )

    [2] => Array
        (
            [GroupCode] => 115
            [GroupDesc] => Agriculture, Forestry Support
            [201308] => 234.04
            [201310] => 343.02
            [201309] => 0
        )

)

person crush    schedule 07.04.2014
comment
Это довольно удивительный ответ - я понятия не имел, что есть array_fill_keys(), и я не знал, что вы можете передавать дополнительные данные в array_walk(). Великолепно! - person Darragh Enright; 07.04.2014
comment
Спасибо за подробный ответ - person Vinayagam; 07.04.2014