У меня есть два ассоциативных массива, например

Array
(
[0] => Array
    (
        [0] => 2022-01-19
        [1] => 6
    )
[1] => Array
    (
        [0] => 2022-01-20
        [1] => 1
    )
[2] => Array
    (
        [0] => 2022-01-21
        [1] => 1
    )
[3] => Array
    (
        [0] => 2022-01-22
        [1] => 2
    )
)

А также

Array
(
[0] => Array
    (
        [0] => 2022-01-17
        [1] => 6
    )
[1] => Array
    (
        [0] => 2022-01-18
        [1] => 1
    )
[2] => Array
    (
        [0] => 2022-01-21
        [1] => 1
    )
[3] => Array
    (
        [0] => 2022-01-23
        [1] => 2
    )
)

Мне нужно объединить их с датой и получить массив результатов, подобный приведенному ниже.

Array
(
[0] => Array
    (
        [0] => 2022-01-17
        [1] => 0
        [2] => 6
    )
[1] => Array
    (
        [0] => 2022-01-18
        [1] => 0
        [2] => 1
    )
[2] => Array
    (
        [0] => 2022-01-19
        [1] => 6
        [2] => 0
    )
[3] => Array
    (
        [0] => 2022-01-20
        [1] => 1
        [2] => 0
    )
[4] => Array
    (
        [0] => 2022-01-21
        [1] => 1
        [2] => 1
    )
[5] => Array
    (
        [0] => 2022-01-22
        [1] => 2
        [2] => 0
    )
[6] => Array
    (
        [0] => 2022-01-23
        [1] => 0
        [2] => 2
    )
)

Я пробовал с приведенным ниже кодом, но безуспешно.

$final_array = [];
foreach($openTicket as $val){
    $closeTicketNo = 0;
    foreach($closeTicket as $value){
        if($val[0] == $value[0]){
            $closeTicketNo = $value[1];
        }
    }
    $final_array[] = [$val[0],$val[1],$closeTicketNo];
}

Я получаю все элементы из $openTicket, но не получаю все элементы из $closeTicket в свой массив результатов $final_array

0
Divyesh Jesadiya 4 Фев 2022 в 10:20
Просто, потому что у вас есть openTicket для closeTicket. Вам также нужно будет сделать closeTicket для openTicket.
 – 
nice_dev
4 Фев 2022 в 10:24
Термин «ассоциативный массив» означает, что ваши ключи являются значимой частью данных и не могут быть отброшены. Вы имели в виду обычный массив?
 – 
Álvaro González
4 Фев 2022 в 10:26
Тогда это будет обычный массив.
 – 
Divyesh Jesadiya
4 Фев 2022 в 10:29
Если бы вы могли объяснить контекст проблемы, а именно: зачем вам нужно объединять два массива, мы могли бы порекомендовать лучшее решение.
 – 
Adison Masih
4 Фев 2022 в 10:33

2 ответа

Лучший ответ

Этот код сначала находит все уникальные даты (используя array_unique) из первых значений в каждом массиве (array_column извлекает значения, а array_merge помещает их в 1 массив).

Затем он индексирует каждый массив по датам (снова используя array_column).

Наконец, перебирая уникальные даты и добавляя новый элемент к выводу со значениями (используя ?? 0, чтобы, если значение не присутствовало, массив по-прежнему заполнялся правильно)...

$dates = array_unique(array_merge(array_column($openTicket, 0), array_column($closedTicket, 0)));
$open = array_column($openTicket, 1, 0);
$closed = array_column($closedTicket, 1, 0);
$finalArray = [];
foreach ($dates as $date) {
    $finalArray[] = [$date, $open[$date] ?? 0, $closed[$date] ?? 0];
}
2
Nigel Ren 4 Фев 2022 в 10:44

Вы можете попробовать это

$array1 = [
    ['2022-01-19',6],
    ['2022-01-20',1],
    ['2022-01-21',0]
];

$array2 = [
    ['2022-01-17',6],
    ['2022-01-20',2],
    ['2022-01-21',1]
];


function mergeMultiple($array1,$array2){
    foreach($array1 as $item1){
        $mergedArray[$item1[0]] = $item1;
    }

    foreach($array2 as $item2){
        if(isset($mergedArray[$item2[0]])){
             array_push($mergedArray[$item2[0]],$item2[1]);
             $mergedArray[$item2[0]] = $mergedArray[$item2[0]];
        }else{
          $mergedArray[$item2[0]] = $item2;
        }
    }

    return array_values($mergedArray);
}

$mergedArray = mergeMultiple($array1,$array2);
ksort($mergedArray);
print_r($mergedArray);
1
Ishaque Javed 4 Фев 2022 в 10:59