2017-05-19 5 views
0

Ich versuche, ein Array von sport zu gruppieren. Es könnte n Anzahl der Sportarten sein. Schließlich, dann erstellen Sie ein neues Array mit ihm. Gibt es einen effizienten Weg, ohne übertrieben zu werden?Gruppieren Array-Elemente basierend auf Zeichenfolge Wert

$sports = [ 
    ['sport' => 'soccer', 'id' => 97487]; 
    ['sport' => 'soccer', 'id' => 244800]; 
    ['sport' => 'soccer', 'id' => 258740]; 
    ['sport' => 'basketball', 'id' => 147884]; 
    ['sport' => 'baseball', 'id' => 222240]; 
    ['sport' => 'baseball', 'id' => 222245]; 
]; 

Initial Array:

array(6) { 
    [0]=> 
    array(2) { 
    ["sport"]=> 
    string(6) "soccer" 
    ["id"]=> 
    int(97487) 
    } 
    [1]=> 
    array(2) { 
    ["sport"]=> 
    string(6) "soccer" 
    ["id"]=> 
    int(244800) 
    } 
    [2]=> 
    array(2) { 
    ["sport"]=> 
    string(6) "soccer" 
    ["id"]=> 
    int(258740) 
    } 
    [3]=> 
    array(2) { 
    ["sport"]=> 
    string(10) "basketball" 
    ["id"]=> 
    int(147884) 
    } 
    [4]=> 
    array(2) { 
    ["sport"]=> 
    string(8) "baseball" 
    ["id"]=> 
    int(222240) 
    } 
    [5]=> 
    array(2) { 
    ["sport"]=> 
    string(8) "baseball" 
    ["id"]=> 
    int(222245) 
    } 
} 

Wunschergebnisse:

array(3) 
{ 
    [0]=> 
    array(3) { 
     [0]=> 
     array(2) { 
      ["sport"]=> 
      string(6) "soccer" 
      ["id"]=> 
      int(97487) 
     } 
     [1]=> 
     array(2) { 
      ["sport"]=> 
      string(6) "soccer" 
      ["id"]=> 
      int(244800) 
     } 
     [2]=> 
     array(2) { 
      ["sport"]=> 
      string(6) "soccer" 
      ["id"]=> 
      int(258740) 
     } 
    } 
    [1]=> 
     array(1) { 
     [0]=> 
     array(2) { 
      ["sport"]=> 
      string(10) "basketball" 
      ["id"]=> 
      int(147884) 
     } 
    } 
    [2]=> 
    array(2) { 
     [0]=> 
     array(2) { 
      ["sport"]=> 
      string(8) "baseball" 
      ["id"]=> 
      int(222240) 
     } 
     [1]=> 
     array(2) { 
      ["sport"]=> 
      string(8) "baseball" 
      ["id"]=> 
      int(222245) 
     } 
    } 
} 
+1

Sie sollten versuchen, ** den Code selbst zu schreiben **. Nach [** mehr Forschung **] (https://meta.stackoverflow.com/q/261592/1011527) Wenn Sie ein Problem haben ** posten Sie, was Sie versucht haben ** mit einer ** klaren Erklärung von was funktioniert nicht ** und bietet [ein minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve). Lesen Sie [Wie Sie fragen] (http://stackoverflow.com/help/how-to-ask) eine gute Frage. Achten Sie darauf, [die Tour zu besuchen] (http://stackoverflow.com/tour) und lesen [this] (https://meta.stackoverflow.com/q/347937/1011527). –

+0

@JayBlanchard meine Entschuldigung. Ich wusste nicht, wo ich anfangen soll. Ich werde mich daran erinnern für zukünftige Referenz. Danke – MaryCoding

Antwort

2

Sie können Gruppe das Array wie folgt:

$sports = [ 
    ['sport' => 'soccer', 'id' => 97487], 
    ['sport' => 'soccer', 'id' => 244800], 
    ['sport' => 'soccer', 'id' => 258740], 
    ['sport' => 'basketball', 'id' => 147884], 
    ['sport' => 'baseball', 'id' => 222240], 
    ['sport' => 'baseball', 'id' => 222245] 
]; 

// we will build an array here where the key is the sport 
// name and the value is an array of objects pertaining 
// to that sport i.e. 'basketball' => [bb1, bb2, ...] 

$array = array(); 

// now consider every sport object in your original array 

foreach($sports as $key => $item) 
{ 
    if (array_key_exists($item['sport'], $array)) { 
    // we encountered this same sport in the past so we 
    // know $array['sportName'] already exists and can 
    // push right to it 
    $array[$item['sport']][] = $item; 
    } else { 
    // we have never seen this sport before and now must 
    // insert the sport into $array['sportName'] = [] 
    // and push this sport object to it 
    $array[$item['sport']] = [$item]; 
    } 
} 

// since $array's keys are the names of the sports themselves, but 
// you want the keys to be numeric, this will build a new array 
// from just the values of $array which at this point contains 
// grouped arrays of sport objects 

$result = array_values($array); 

// print the results for good measure :) 

print_r($result); 

Dies wird durch Schleifen über Ihren Sport-Array arbeitet und Aufbau eines zweiten Arrays von [sportName => arrayOfThatSport]. Innerhalb der for-Schleife überprüfen wir, ob ein bestimmter Sport in diesem Array bereits existiert. Wenn das der Fall ist, fügen Sie den Sport dem entsprechenden Array für diesen Sport hinzu. Erstellen Sie andernfalls ein neues Array für diesen Sport, das unter $array['sportName'] = [sportObject] verfügbar ist. Wenn Sie mehrere Iterationen der Schleife betrachten, werden Sie sehen, dass wir entweder immer ein bestehendes $array['sportName'] Array hinzufügen oder ein neues Array an dieser Position erstellen, wenn wir einem neuen Sport begegnen, den wir noch nie gesehen haben. Dies gibt uns ein endgültiges Array ähnlich zu: [ "sport : [...], "sport2": [...] ] aber in Ihrem Fall wollen Sie ein numerisches Array nicht ein assoziatives Array, daher der Aufruf an array_values.

+0

perfekte Lösung – RomMer

+0

Große Erklärung und in der Tat eine perfekte Lösung – MaryCoding

0

Dies ist meine vorgeschlagene Lösung.

$groupedSports = []; 
foreach ($sports as $item) { 
    if (empty($groupedSports[$item['sport']])) { 
     $groupedSports[$item['sport']] = []; 
    } 
    $groupedSports[$item['sport']][] = $item; 
} 

Kurze Erläuterung:

  • Linie 1: Wir initialisieren einen leeren Array
  • Zeile 2: wir eine Schleife auf der Original-Array beginnen
  • Linie 3-5: wenn es das erste ist, Vorkommen für den aktuellen Sport, wir initialisieren ein leeres Array für diese Sportart (Warnungen vermeiden)
  • Zeile 6: wir ordnen das aktuelle Element dem entsprechenden Array zu
+1

Während dieser Code kann die Frage beantworten, bietet zusätzliche Kontext in Bezug auf warum und/oder wie dieser Code die Frage beantwortet verbessert seinen langfristigen Wert. Eine *** gute Antwort *** wird immer eine Erklärung haben, was getan wurde und warum es so gemacht wurde, nicht nur für das OP, sondern auch für zukünftige Besucher von SO. –

+1

@JayBlanchard du hast Recht, aber ich habe gerade eine Pause von einem langweiligen Job gemacht, also habe ich es einfach genossen :-) Ich werde nun meine Frage entsprechend bearbeiten. –

Verwandte Themen