2016-04-24 3 views
2

У меня есть два массива, $ ids и $ quants (ids и количества элементов запаса), которые необходимо объединить, но вместо замены или удаления дубликатов их значения следует добавить вместе.Объедините два массива, но добавьте значения дубликатов ключей вместе

В настоящее время я использую array_combine(), но это означает, что некоторые из величин теряются, когда существует несколько одинаковых идентификаторов.

например.

$ids = Array(1, 1, 2, 3); 
$quants = Array(10, 20, 30, 40); 

Желаемый результат:

$combined = Array(
[1] => 30 
[2] => 30 
[3] => 40 
) 

Заранее спасибо за любые советы

ответ

3
$ids = Array(1, 1, 2, 3); 
$quants = Array(10, 20, 30, 40); 

$a = array_unique($ids); 
$a = array_combine($a, array_fill(0, count($a), 0)); 

foreach($ids as $k=>$v) { 
    $a[$v] += $quants[$k]; 
} 

print_r($a); 
+0

лучший подход в зависимости от меня. ваше логическое мышление очень-очень сильно. +10 –

+0

Мне пришлось читать его 4 раза, но да, даже короче моего решения. Совет: ваш 'array_combine ($ a, array_fill (0, count ($ a), 0))' может быть заменен на 'array_fill_keys ($ a, 0)' –

+0

@Peter van der Wal Спасибо. Я никогда не встречал эту функцию – splash58

1

Существует не встроенная функция, так что вы должны сделать это сами:

function my_array_combine($keys, $values) 
{ 
    if (count($keys) != count($values)) { 
     throw new InvalidArgumentException('More or less'); 
    } 

    $result = array(); 

    $values = array_values($values); // make sure it is indexed 0, 1, 2 
    foreach(array_values($keys) as $idx => $key) { 
     // Correspondending value is at $values[$idx]; 
     if (isset($result[$key])) { 
      $result[$key] += $values[$idx]; 
     } else { 
      $result[$key] = $values[$idx]; 
     } 
    } 

    return $result; 
} 
+0

Спасибо за ответ! Я пойду с другим, хотя – hyclrs

+0

@hyclrs Я понимаю, хороший выбор;) –