it-swarm.com.de

Wie gruppiere ich ein mehrdimensionales Array nach einem bestimmten Unterfeldwert

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

Ich versuche, sie nach level zu gruppieren, aber ich kenne den Pegel nicht vorher. Es ist also nicht so, dass ich es in eine for-Schleife stecken und while $i < 7 sagen kann, da ich nicht weiß, dass 7 der Maximalwert für den Level-Schlüssel ist selbst wenn ich es tat ... 

Array (
   [0] => Array (
          [cust] => XT8900
          [type] => standard
          [level] => 1
          )
   [1] => Array (
          [cust] => XT8944
          [type] => standard
          [level] => 1
          )
   [2] => Array (
          [cust] => XT8922
          [type] => premier
          [level] => 3
          )
   [3] => Array (
          [cust] => XT8816
          [type] => permier
          [level] => 3
          )
   [4] => Array (
          [cust] => XT7434
          [type] => standard
          [level] => 7
          )
)

Was ich hoffe zu produzieren:

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
                 )
          )
)
26
n00b0101

Sie müssen sie zuerst nach level gruppieren 

Verwenden Sie foreach , um in das Array zu gelangen. Überprüfen Sie, ob der Level dem vorherigen Element entspricht, und gruppieren Sie ihn 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 gewünschte Format angezeigt

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
             )
      )
10
Gerard Banasig

Wenn Sie die Kontrolle über das Erstellen des ursprünglichen Arrays haben, können Sie beim Hinzufügen von Einträgen die Dinge am Anfang so einrichten.

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

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

Lässt Sie mit dem Formular, das Sie wollten, und alles zusammen, auf das verwiesen wird.

Bauen Sie das Array jedoch so auf, dass es überhaupt möglich ist.

36
Mike
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');
7
Farzher

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

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

Um $ myarray nach dem Schlüssel mit dem Namen "level" zu sortieren, führen Sie einfach Folgendes aus:

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

Oder wenn Sie es nicht als Funktion haben möchten, nur für eine einmalige Verwendung, würde dies $ myNewArray aus $ myArray erzeugen, gruppiert nach dem Schlüssel "level".

foreach ($myArray as $key=>$val) $myNewArray[$val['level']][]=$val;
5
Kevin Hagerty
  $result = array();
    foreach ($yourArrayList as $data) {
        $id = $data['level'];
        if (isset($result[$id])) {
            $result[$id][] = $data;
        } else {
            $result[$id] = array($data);
        }
    }
1
user4155960

Am besten und.

    $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); 
0
VIPAN KUMAR