2016-04-24 7 views
2

Ich habe zwei Arrays, $ ids und $ quants (IDs und Mengen von Lagerartikeln), die kombiniert werden müssen, aber anstatt Duplikate zu ersetzen oder zu entfernen, sollten ihre Werte hinzugefügt werden zusammen.Kombinieren Sie zwei Arrays, aber addieren Werte von doppelten Schlüsseln zusammen

Derzeit verwende ich array_combine(), aber das bedeutet, dass einige der Mengen verloren gehen, wo mehrere der gleichen ID existiert.

z.B.

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

gewünschte Ausgabe:

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

Vielen Dank im Voraus für jede Beratung

Antwort

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

besten Ansatz nach mir. Ihr logisches Denken ist sehr, sehr stark. +10 –

+0

Ich musste es 4 mal lesen, aber ja, noch kürzer als meine Lösung. Tipp: Ihre 'array_combine ($ a, array_fill (0, count ($ a), 0))' kann durch 'array_fill_keys ($ a, 0)' ersetzt werden –

+0

@Peter van der Wal Danke. Ich habe diese Funktion nie getroffen – splash58

1

Es gibt nicht eine eingebaute Funktion, so dass Sie es selbst zu tun haben:

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

Danke für die Beantwortung! Ich werde mit dem anderen gehen, obwohl – hyclrs

+0

@hyclrs ich verstehe, gute Wahl;) –

Verwandte Themen