2017-11-07 2 views
1

Was ist der beste Weg, um die ‚val‘ Feld mit der gleichen ‚Farbe‘ für jede andere Farbe zusammenzufassen:PHP - Summenwerte mit dem gleichen Schlüssel

Array 
(
    [0] => Array 
     (
      [color]=> "red" 
      [val]=> 4 
     ) 

    [1] => Array 
     (
      [color]=> "green" 
      [val]=> 3 
     ) 

    [2] => Array 
     (
      [color]=> "blue" 
      [val]=> 1 
     ) 

    [3] => Array 
     (
      [color]=> "green" 
      [val]=> 6 
     ) 

    [4] => Array 
     (
      [color]=> "blue" 
      [val]=> 2 
     ) 
) 

Wunschergebnis: rot: 4; grün: 9; blau: 3.

Grüße, Elio Fernandes

+2

Ich bin mir sicher, dass es eine super glatte Methode gibt, dies in einer Zeile mit 'array_walk' oder Callbacks zu machen, aber es gibt etwas über die Lesbarkeit einer einfachen Schleife zu sagen. Ich würde es wiederholen. Auch "das Beste" ist subjektiv. In Bezug auf die Leistung sind beide Methoden wahrscheinlich ungefähr gleich. – bassxzero

Antwort

0

Ich würde es auf diese Art und Weise tun, mit einer foreach-Schleife:

$temp = []; 
foreach($arr as $value) { 
    //check if color exists in the temp array 
    if(!array_key_exists($value['color'], $temp)) { 
     //if it does not exist, create it with a value of 0 
     $temp[$value['color']] = 0; 
    } 
    //Add up the values from each color 
    $temp[$value['color']] += $value['val']; 
} 
1

Ich würde Schleife es zur besseren Lesbarkeit willen.

$output = array(); 
foreach($array as $value){ 
    if(!isset($output[$value['color']])) $output[$value['color']] = 0; //Ensure the value is 0 if it doesn't exist 
    $output[$value['color']] += $value['val']; //Add the total for that color 
} 

Dies wird ein Array von Farben zu Gesamtzählungen zurückgeben.

+0

Ich mag die schlichte Eleganz der alten Schule. Sauber, direkt, auf den Punkt. – IncredibleHat

1

persönlich so etwas wie dies mit array_reduce ich tun würde, aber, wie oben erwähnt, ist vielleicht nicht die meisten lesbar Option sein. Definitiv eine Frage der Meinung.

$result = array_reduce($array, function ($carry, $item) { 
    $carry[$item['color']] = $carry[$item['color']] ?? 0; 
    $carry[$item['color']] += $item['val']; 
    return $carry; 
}, []); 

Siehe https://eval.in/894644

Edit: Fix bemerkt

+0

Ist 'array_reduce' schneller als eine Schleife? Ich mag diese Lösung so oder so, aber ich bin neugierig :) – GrumpyCrouton

+0

Kann mir nicht vorstellen, dass da viel drin ist, aber wenn ich raten müsste, würde ich sagen, dass eine Schleife wahrscheinlich schneller war. Obwohl Sie natürlich nicht von einem Array mit 100.000 Objekten sprechen, werden Sie es nicht bemerken. – iainn

1

Sie array_reduce können weniger und besser lesbaren Code haben:

$array = array 
(
    0 => array("color"=> "red","val"=> 4), 
    1 => array("color"=> "blue","val"=> 3), 
    2 => array("color"=> "blue","val"=> 1) 
); 

function sum($accumulator, $item){ 
    $accumulator[$item['color']] = $accumulator[$item['color']] ?? 0; 
    $accumulator[$item['color']] += $item['val']; 
    return $accumulator; 
} 

$sum = array_reduce($array, "sum"); 
var_dump($sum); // return here array(2) { ["red"]=> int(4) ["blue"]=> int(4) } 

und die Dokumentation: http://php.net/manual/en/function.array-reduce.php

+0

Das berücksichtigt die Farben nicht – iainn

+0

uhm, ich werde das updaten! – mickaelw

+0

Antwort aktualisiert, danke @iainn – mickaelw

-1
$arrays = array( 
     array(
       "color"=>"red", 
       "val"=>4 
     ), 
     array( 
       "color"=>"green", 
       "val"=>3 
     ) 
); 
foreach ($color as $array) { 
    echo $array["color"].": ".$array["val"].";"; 
} 
+0

Das wird Nachrichten überall ausspucken. – IncredibleHat

+0

Aktualisierung @Randall –

Verwandte Themen