добавить значения в первый массив для каждого соответствующего идентификатора во втором массиве в PHP - PullRequest
0 голосов
/ 17 июня 2019

У меня есть два таких массива:

Массив1

$array1 = Array
(
    0 => Array
        (
            'ID' => 101,
            'Code' => 1075,
            'Date' => '2012-03-03 17:13:12.433'
        ),

    1 => Array
        (
            'ID' => 103,
            'Code' => 175,
            'Date' => '2012-09-05 20:30:02.217'
        ),

    2 => Array
        (
            'ID' => 109,
            'Code' => 178,
            'Date' => '2012-07-05 20:30:02.217'
        )

);

Массив2

$array2 = Array
(
    0 => Array
        (
            'Amount' => 1234,
            'ID' => 101
        ),

    1 => Array
        (
            'Amount' => 5656,
            'ID' => 101
        ),
    2 => Array
        (
            'Amount' => 1342,
            'ID' => 103
        ),

    3 => Array
        (
            'Amount' => 0,
            'ID' => 0
        )

);

I 'используя приведенный ниже код для объединения двух массивов:

$arr2 = array_column($array2, "ID");

$finalArray = array();
foreach($array1 as $arr){
    $key = array_search($arr['ID'], $arr2);
    if($key ===false){
        $key = array_search(0, $arr2);
    }
    unset($array2[$key]['ID']);
    $finalArray[] =     array_merge($arr,$array2[$key]);
}

print_r($finalArray);

Текущий вывод с использованием кода выше:

finalArray

    Array
(
    [0] => Array
        (
            [ID] => 101
            [Code] => 1075
            [Date] => 2012-03-03 17:13:12.433
            [Amount] => 1234 //considers only the first entry of ID 101
        )

    [1] => Array
        (
            [ID] => 103
            [Code] => 175
            [Date] => 2012-09-05 20:30:02.217
            [Amount] => 1342
        )

    [2] => Array
        (
            [ID] => 109
            [Code] => 178
            [Date] => 2012-07-05 20:30:02.217
            [Amount] => 0
        )

)

Но так как в array2 есть две записи для идентификатора 101, но код выше принимает только первое совпадение для совпадающего идентификатора .Ожидаемый результат:

Требуемый выход

   Array
(
    [0] => Array
        (
            [ID] => 101
            [Code] => 1075
            [Date] => 2012-03-03 17:13:12.433
            [Amount] => 1234 //amount for first entry of ID 101
        )
    [1] => Array
        (
            [ID] => 101
            [Code] => 1075
            [Date] => 2012-03-03 17:13:12.433
            [Amount] => 5656//amount for second entry of ID 101
        )
    [2] => Array
        (
            [ID] => 103
            [Code] => 175
            [Date] => 2012-09-05 20:30:02.217
            [Amount] => 1342
        )

    [3] => Array
        (
            [ID] => 109
            [Code] => 178
            [Date] => 2012-07-05 20:30:02.217
            [Amount] => 0
        )

)

Я не могу понять, какой цикл использовать.Код должен добавить строки для каждого совпадающего идентификатора array2.Как мне изменить мой текущий код так, чтобы он дал мне желаемый результат?

Ответы [ 2 ]

1 голос
/ 18 июня 2019
$arr2 = array_column($array2, "ID");

$finalArray = array();
foreach($array1 as $arr){

    //Get the index of ID which exist in array2. And store in search variable.
    $search = array_keys($arr2, $arr['ID']);

    if(!$search){
        //If ID not exit in array-2, get the index of that ID and store in search variable. 
         $key = array_search(0, $arr2);
         $search[0] = $key;
         unset($array2[$key]['ID']);
    }

    //Fetch search item and merge.
    foreach($search as $value){
        $finalArray[] =  array_merge($arr,$array2[$value]);
    }
}

echo "<pre>";
print_r($finalArray);
1 голос
/ 17 июня 2019

Сделать результирующий массив ассоциативным массивом с ключом по ID.Вы можете скопировать элемент первого массива в результат, а затем добавить суммы из второго массива.

$finalResult = [];
foreach ($array1 as $arr) {
    $finalResult[$arr['ID']] = $arr;
}
foreach ($array2 as $row) {
    $id = $row['ID'];
    unset($row['ID']);
    foreach ($row as $col => $value) {
        if (empty($finalResult[$id][$col])) {
            $finalResult[$id][$col] = $value;
        } else {
            $finalResult[$id][$col] += $value;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...