105 votes

Comment grouper des sous-matrices par la valeur d'une colonne ?

J'ai le tableau suivant

Array
(
    [0] => Array
        (
            [id] => 96
            [shipping_no] => 212755-1
            [part_no] => reterty
            [description] => tyrfyt
            [packaging_type] => PC
        )

    [1] => Array
        (
            [id] => 96
            [shipping_no] => 212755-1
            [part_no] => dftgtryh
            [description] => dfhgfyh
            [packaging_type] => PC
        )

    [2] => Array
        (
            [id] => 97
            [shipping_no] => 212755-2
            [part_no] => ZeoDark
            [description] => s%c%s%c%s
            [packaging_type] => PC
        )

)

Comment puis-je grouper le tableau par id ? Y a-t-il des fonctions natives de php disponibles pour faire cela ?

Bien que cette approche fonctionne, je veux faire cela en utilisant une foreach En effet, avec ce qui précède, j'obtiendrai des éléments en double, ce que j'essaie d'éviter ?

Dans l'exemple ci-dessus id a deux éléments, il doit donc se trouver à l'intérieur de l'élément id

5voto

Jake Z Points 1340

Si vous souhaitez une alternative à Composer avec une suite complète de tests, le programme array_group_by permet d'obtenir ce que vous recherchez. Divulgation complète : je suis l'auteur de cette bibliothèque.

$grouped = array_group_by($arr, 'id');

Il prend également en charge les regroupements à plusieurs niveaux, voire des regroupements complexes grâce à l'utilisation de fonctions de rappel personnalisées :

// Multilevel grouping
$grouped = array_group_by($arr, 'id', 'part_no');

// Grouping by a callback/callable function
$grouped = array_group_by($records, function ($row) {
    return $row->city;
});

4voto

Mahidul Islam Points 302

$arr = Data Araay ;

$fldName = Group By Colum Name ;

function array_group_by( $arr, $fldName) {
    $groups = array();
    foreach ($arr as $rec) {
        $groups[$rec[$fldName]] = $rec;
    }
    return $groups;
}

function object_group_by( $obj, $fldName) {
    $groups = array();
    foreach ($obj as $rec) {
        $groups[$rec->$fldName] = $rec;
    }
    return $groups;
}

2voto

Sebass van Boxel Points 1107
$arr = array();

foreach($old_arr as $key => $item)
{
   $arr[$item['id']][$key] = $item;
}

ksort($arr, SORT_NUMERIC);

2voto

Amrish Prajapati Points 631
for($i = 0 ; $i < count($arr)  ; $i++ )
{
    $tmpArr[$arr[$i]['id']] = $arr[$i]['id'];
}
$vmpArr = array_keys($tmpArr);
print_r($vmpArr);

2voto

rwhite Points 430

Développant la réponse de @baba, que j'aime bien, mais qui crée un multidimensionnel plus complexe à trois niveaux de profondeur (array(array(array))) :

$group = array();
 foreach ( $array as $value ) {
   $group[$value['id']][] = $value; 
 }

// output only data from id 96
foreach ($group as $key=>$value) { //outer loop
 foreach ($value as $k=>$v){ //inner loop
  if($key==96){ //if outer loop is equal to 96 (could be variable)
   for ($i=0;$i<count($k);$i++){ //iterate over the inner loop
        printf($key.' has a part no. of '.$v['part_no'].' and shipping no. of '.$v['shipping_no'].'<br>');
   }
 }
}
 }

La sortie est prévue :

96 a un numéro de pièce de reterty et un numéro d'expédition de 212755-1

96 a un numéro de pièce de dftgtryh et un numéro d'expédition de 212755-1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X