Gruppieren Sie 2D-Array-Daten mithilfe des Spaltenwerts, um ein 3D-Array zu erstellen

Lesezeit: 5 Minuten

Benutzeravatar von n00b0101
n00b0101

Ich habe ein mehrdimensionales Array und versuche, sie nach dem Wert in einer bestimmten Spalte zu gruppieren.

Ich versuche, sie zu gruppieren level, aber ich werde das Niveau vorher nicht wirklich kennen. Es ist also nicht so, dass ich es in a stecken kann for Schleife und sage while $i < 7weil ich das nicht wissen werde 7 ist der maximale Wert für den Level-Schlüssel, und ehrlich gesagt bin ich mir nicht sicher, ob ich es so machen müsste, selbst wenn ich es täte.

[
    ['cust' => 'XT8900', 'type' => 'standard', 'level' => 1],
    ['cust' => 'XT8944', 'type' => 'standard', 'level' => 1],
    ['cust' => 'XT8922', 'type' => 'premier', 'level' => 3],
    ['cust' => 'XT8816', 'type' => 'permier', 'level' => 3],
    ['cust' => 'XT7434', 'type' => 'standard', 'level' => 7],
]

Erwünschtes Ergebnis:

Array (

   [1] => Array (
          [0] => Array (
                    [cust] => XT8900
                    [type] => standard
                    )
          [1] => Array (
                    [cust] => XT8944
                    [type] => standard
                    )
          )

   [3] => Array (
          [2] => Array (
                 [cust] => XT8922
                 [type] => premier
                 )

          [3] => Array (
                 [cust] => XT8816
                 [type] => permier
                 )
          )

   [7] => Array (
          [4] => Array (
                 [cust] => XT7434
                 [type] => standard
                 )
          )
)

Wenn Sie die Kontrolle über das Erstellen des anfänglichen Arrays haben, ist es am besten, die Dinge am Anfang so einzurichten, wenn Sie Einträge hinzufügen.

Wenn nicht, erstellen Sie ein temporäres Array zum Sortieren:

foreach ($input_arr as $key => &$entry) {
    $level_arr[$entry['level']][$key] = $entry;
}

Hinterlässt das gewünschte Formular und alles zusammen referenziert.

Bauen Sie das Array von Anfang an so auf, wenn dies überhaupt möglich ist.

  • Ich verstehe den Vorteil der Herstellung nicht $entry eine Referenz.

    – mickmackusa

    10. Februar um 5:21 Uhr

  • @MickMackusa foreach erstellt unter bestimmten Umständen eine Kopie des Arrays, über das es iteriert. Die ausdrückliche Verwendung einer Referenz bedeutet, dass Sie sicher sein können, dass sie nicht kopiert, was ein riesiges Eingabearray sein könnte. Ich weiß nicht, ob diese Mikrooptimierung im Jahr 2023 relevant ist, die Welt war viel jünger, als ich diese Antwort ursprünglich geschrieben habe 🙂

    – Mike

    12. Februar um 12:49 Uhr

Benutzeravatar von Gerard Banasig
Gerhard Banasig

Sie müssen sie gruppieren eben Erste

Verwenden für jede Um in das Array zu schleifen, prüfen Sie, ob die Ebene mit dem vorherigen Element identisch ist, und gruppieren Sie es dann mit diesem Array

  $templevel=0;   

  $newkey=0;

  $grouparr[$templevel]="";

  foreach ($items as $key => $val) {
   if ($templevel==$val['level']){
     $grouparr[$templevel][$newkey]=$val;
   } else {
     $grouparr[$val['level']][$newkey]=$val;
   }
     $newkey++;       
  }
print($grouparr);

Die Ausgabe von print($grouparr); wird wie das Format angezeigt, das Sie sich erhofft haben

Sie können es auch versuchen

print($grouparr[7]);

Wird angezeigt

 [7] => Array (
      [4] => Array (
             [cust] => XT7434
             [type] => standard
             )
      )

Oder

print($grouparr[3]);

Wird angezeigt

[3] => Array (
      [2] => Array (
             [cust] => XT8922
             [type] => premier
             )

      [3] => Array (
             [cust] => XT8816
             [type] => permier
             )
      )

  • Ich denke, die ‘if’-Klausel in Ihrem obigen Code ist überflüssig, da die Zeile ” $grouparr[$val[‘level’]][$newkey]=$val; ” funktioniert für alle Fälle. Mit anderen Worten, diese Zeile gilt auch für den Fall, dass ‘$templevel’ gleich ‘$val’ ist[‘level’]’. In diesem Fall wäre der Code also einfach: $templevel=0; $newkey=0; foreach ($items als $key => $val) { $grouparr[$val[‘level’]][$newkey]=$val; $newkey++; } print($grouparr);

    – Vasilis

    28. Oktober 2020 um 10:40 Uhr


Hier ist die Lösung, auf die ich für ein identisches Problem gelandet bin, das als Funktion verpackt ist:

function arraySort($input,$sortkey){
  foreach ($input as $key=>$val) $output[$val[$sortkey]][]=$val;
  return $output;
}

Um $myarray nach dem Schlüssel namens “level” zu sortieren, tun Sie einfach Folgendes:

$myArray = arraySort($myArray,'level');

Oder wenn Sie es nicht als Funktion wollten, nur für eine einmalige Verwendung, würde dies $myNewArray aus $myArray erstellen, gruppiert nach dem Schlüssel ‘level’

foreach ($myArray as $key=>$val) $myNewArray[$val['level']][]=$val;

  • das ist so eine nützliche Antwort. Ich versuche, dies zu verwenden, aber $val ist ein eindeutiger Wert. Vorschläge?

    – zeichnete Schmaltz

    22. April 2014 um 4:31 Uhr

  • Diese Antwort liefert nicht die gewünschte Ausgabe des OP, da die Subarray-Schlüssel nicht erhöht werden. Nachweisen: sandbox.onlinephpfunctions.com/code/…

    – mickmackusa

    24. August 2018 um 3:17 Uhr

function group_assoc($array, $key) {
    $return = array();
    foreach($array as $v) {
        $return[$v[$key]][] = $v;
    }
    return $return;
}

//Group the requests by their account_id
$account_requests = group_assoc($requests, 'account_id');

  $result = array();
    foreach ($yourArrayList as $data) {
        $id = $data['level'];
        if (isset($result[$id])) {
            $result[$id][] = $data;
        } else {
            $result[$id] = array($data);
        }
    }

  • Nur-Code-Antworten sind auf StackOverflow von geringem Wert, da sie das OP und zukünftige Forscher schlecht schulen – jede Antwort (auch grundlegende) sollte eine Art Erklärung darüber enthalten, wie die Lösung funktioniert und warum sie ratsam ist. Diese Antwort liefert NICHT die gewünschte Ausgabe, wie von der Frage vorgegeben, da sie die Subarray-Schlüssel nicht erhöht. Nachweisen: sandbox.onlinephpfunctions.com/code/…

    – mickmackusa

    24. August 2018 um 3:21 Uhr

Benutzeravatar von VIPAN KUMAR
VIPAN KUMAR

Beste Ans.

    $levels = array_unique(array_column($records, 'level'));

    $data = array();

    foreach($records as $key => $value){ 

    $data[$levels[array_search($value['level'],$levels )]][] = $value ; 

    }

    print_r($data); 

  • Nur-Code-Antworten sind auf StackOverflow von geringem Wert, da sie das OP und zukünftige Forscher schlecht schulen – jede Antwort (auch grundlegende) sollte eine Art Erklärung darüber enthalten, wie die Lösung funktioniert und warum sie ratsam ist. Diese Antwort liefert NICHT die gewünschte Ausgabe, wie von der Frage vorgegeben, da sie die Subarray-Schlüssel nicht erhöht. Nachweisen: sandbox.onlinephpfunctions.com/code/…

    – mickmackusa

    24. August 2018 um 3:21 Uhr

Benutzeravatar von mickmackusa
mickmackusa

Um die exakte dessured-Ausgabe der Frage aus der Beispieleingabe zu generieren, ziehen/kopieren Sie den letzten Wert aus jeder Zeile und verwenden Sie diesen Wert als Gruppierungsschlüssel der ersten Ebene. Verwenden Sie dann den ursprünglichen Index der ersten Ebene als Schlüssel der zweiten Ebene. Schieben Sie dann die beiden verbleibenden Elemente in die Teilmenge der Gruppe.

Code: (Demo)

$result = [];
foreach ($array as $key => $row) {
    $result[array_pop($row)][$key] = $row;
}
var_export($result);

Verwenden Sie für funktionale Stilsyntax array_reduce(). (Demo)

var_export(
    array_reduce(
        array_keys($array),
        function($result, $key) use ($array) {
            $result[array_pop($array[$key])][$key] = $array[$key];
            return $result;
        }
    )
);

1444950cookie-checkGruppieren Sie 2D-Array-Daten mithilfe des Spaltenwerts, um ein 3D-Array zu erstellen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy