PHP добавляет значения с одинаковыми идентификаторами

#php #mysql #arrays

#php #mysql #массивы

Вопрос:

Вот еще один PHP для всех вас!

У меня есть два массива, исходящих из двух таблиц, которые имеют одинаковые названия столбцов, но разные значения. Я создал запрос, который вызывает обе таблицы для выгрузки данных в массивы. Значения, которые я получаю, являются: —

 Array {
    [0] {
        [id] => 23,
        [count] => 300
    },
    [1] {
        [id] => 43,
        [count] => 400
    }
}
  

и

 Array {
    [0] {
        [id] => 43,
        [count] => 200
    },
    [1] {
        [id] => 78,
        [count] => 55
    }
}
  

Что я хочу сделать, так это: —

 Array {
    [0] {
        [id] => 23,
        [count] => 300
    },
    [1] {
        [id] => 43,
        [count] => 600 <---- Notice how this has been added together
    },
    [2] {
        [id] => 78,
        [count] => 55
    }
}
  

Как бы я это сделал?

Комментарии:

1. и что же вы пробовали до сих пор?

2. Просто обычные array_merge и array_push

3. отлично, добавьте код … так будет легче сказать вам, что не так

Ответ №1:

array_merge на первый взгляд может показаться хорошим вариантом, но на самом деле это не так, поскольку он не объединяет цифровые клавиши, а просто добавляет их.

Проще всего было бы написать свою собственную функцию для этого слияния.

Будет выглядеть примерно так:

 function merge_array($first, $second)
{
    $result = array();
    append_array($result, $first);
    append_array($result, $second);

    return $result;
}

function append_array(amp;$result, $array)
{
    foreach($array as $entry){
        $index = get_element_index($result, $entry);
        if($index < 0){
            // Add as normal
            $result[] = $entry;
        }else{
            $result[$index]['count'] = $result[$index]['count']   $entry['count'];
        }

    }
}

function get_element_index($array, $element)
{
    for($i = 0; $i < count($array); $i  ){
        if($entry['id'] == $element['id']){
            return $i;
        }
    }
    return -1;
}