web-dev-qa-db-fra.com

Comment grouper un tableau multidimensionnel par une valeur de sous-tableau particulière?

J'ai un tableau multidimensionnel et j'essaie de les regrouper en fonction de la valeur dans une colonne spécifique. 

J'essaie de les regrouper par level, mais je ne saurai pas vraiment le niveau à l'avance. Donc, ce n'est pas comme si je pouvais le mettre dans une boucle for et dire while $i < 7, parce que je ne saurai pas que 7 est la valeur maximale pour la clé de niveau, et franchement, je ne suis pas sûr que ce soit ce que je devrais faire. même si je le faisais ... 

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

Ce que j'espère produire:

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

Vous devez les regrouper par niveau premier 

Utilisez foreach pour boucler dans un tableau, vérifiez si le niveau est identique à l’élément précédent, puis regroupez-le avec ce tableau.

  $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);

La sortie de print ($ grouparr); s'affichera comme le format que vous espériez

Vous pouvez aussi essayer de 

print($grouparr[7]);

Affichera

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

Ou 

print($grouparr[3]);

Affichera

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

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

La meilleure façon, si vous avez le contrôle sur la construction du tableau initial, est simplement de configurer les choses comme cela au début, lorsque vous ajoutez des entrées.

Sinon, construisez un tableau temporaire pour trier:

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

Vous laisse avec le formulaire que vous vouliez et tout référencé ensemble.

Construisez le tableau comme ça en premier lieu, si possible.

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

Voici la solution que j'ai trouvée pour un problème identique, encapsulé comme une fonction:

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

Pour trier $ myarray par la clé nommée "level", procédez comme suit:

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

Ou si vous ne le vouliez pas comme fonction, juste pour un usage unique, cela créerait $ myNewArray à partir de $ myArray, groupé par la clé '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

Meilleur et.

    $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