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
)
)
)
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
)
)
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.
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');
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;
$result = array();
foreach ($yourArrayList as $data) {
$id = $data['level'];
if (isset($result[$id])) {
$result[$id][] = $data;
} else {
$result[$id] = array($data);
}
}
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);