2017-06-10 3 views
0

Kürzlich arbeite ich an einem Projekt, das 'Superheros' und 'Supervillains' nach ihrer 'Franchise' und dem Ursprung von 'Superpower' kategorisiert. Ich möchte Daten aus Datenbank wie Array 1 abrufen und zeigt sie als Array 2 in PHP.Gruppierung von Arrays in PHP und Zählung von Daten

Array #1 

Array 
(
    [0] => Array 
    (
     [id] => 101 
     [Name] => Superman 
     [Franchise] => DC Comics 
     [Superpower] => Inherent 
    ) 

    [1] => Array 
    (
     [id] => 908 
     [Name] => Batman 
     [Franchise] => DC Comics 
     [Superpower] => Acquired 
    ) 

    [2] => Array 
    (
     [id] => 228 
     [Name] => Wolverine 
     [Franchise] => Marvel 
     [Superpower] => Acquired 
    ) 

    [3] => Array 
    (
     [id] => 158 
     [Name] => Iron Man 
     [Franchise] => Marvel 
     [Superpower] => Acquired 
    ) 

    [4] => Array 
    (
     [id] => 978 
     [Name] => Thor 
     [Franchise] => Marvel 
     [Superpower] => Inherent 
    ) 
) 

Array # 1 Elemente gruppiert auf ihre ‚Franchise‘ zu stützen und zählen, wie viele von ihnen ‚Inherent‘ oder ‚Erworbene‘ im Sinne von ‚Supermacht‘ sind.

Array #2 


Array 
(
    [DC Comics] => Array 
    (
     [Inherent] => 1 
     [Acquired] => 1 
    ) 

    [Marvel] => Array 
    (
     [Inherent] => 1 
     [Acquired] => 2 
    ) 
) 
+1

Wo ist Ihr Code versucht? – MikeBergerUS

+1

Thor erbte seine Supermacht nicht. Ihm wurde der Mjolnir gegeben. – Goose

+0

was willst du zählen ?? Array von Wert oder Array von gleichen Schlüssel ?? –

Antwort

1

Hier ist der Code, ohne viel Logik,

foreach ($array1 as $val) { 
    if(!isset($array2[$val['Franchise']])) { 
     $array2[$val['Franchise']] = array('Inherent' => 0, 'Acquired' => 0); 
    } 
    $array2[$val['Franchise']][$val['Superpower']]++; 
} 

print_r($array2); 
+0

Dies ist genau das, was ich suchte, einfach und kompakt. Vielen Dank.. – Satya

1
  1. array_column() Funktion einen inneren Schlüssel aus einem 2D-Array aggregieren.

  2. array_count_values() Funktion zählt alle Werte eines Arrays.

Mit diesem Code-Schnipsel für Zählwerte:

$a = array (array ("id" => "101", "Name" => "Superman", "Franchise" => "DC Comics", "Superpower" => "Inherent"), 
    array ("id" => "908", "Name" => "Batman", "Franchise" => "DC Comics", "Superpower" => "Acquired"), 
    array ("id" => "228", "Name" => "Wolverine", "Franchise" => "Marvel", "Superpower" => "Acquired"), 
    array ("id" => "158", "Name" => "Iron Man", "Franchise" => "Marvel", "Superpower" => "Acquired"), 
    array ("id" => "978", "Name" => "Thor", "Franchise" => "Marvel", "Superpower" => "Inherent")); 
    echo "<pre>"; 
$return = array(); 
// first group array values by franchise 
foreach($a as $val) { 
    if (!isset($return[$val['Franchise']])) { 
     $return[$val['Franchise']] = array(); 
    } 
    $return[$val['Franchise']][] = $val; 
} 
$arr = array(); 
// count elements by key value pair in particular franchise 
foreach ($return as $key => $value) { 
    $tmp = array_count_values(array_column($value, 'Superpower')); 
    $arr[$key] = $tmp; 
} 
print_r($arr); 

Demo is here

1

Mit Einzel- und kurzen array_reduce:

// $arr is your initial array 
$result = array_reduce($arr, function($r, $v){ 
    if (isset($r[$v["Franchise"]][$v["Superpower"]])) { 
     $r[$v["Franchise"]][$v["Superpower"]] += $r[$v["Franchise"]][$v["Superpower"]]; 
    } else { 
     $r[$v["Franchise"]][$v["Superpower"]] = 1; 
    } 
    return $r; 
}, []); 

print_r($result); 

Der Ausgang:

Array 
(
    [DC Comics] => Array 
     (
      [Inherent] => 1 
      [Acquired] => 1 
     ) 

    [Marvel] => Array 
     (
      [Acquired] => 2 
      [Inherent] => 1 
     ) 
)