Trier un tableau avec des sous ensemble

Voici une méthode qui permet de trier un tableau sur la clé des enfants.


1er exemple de tableau avant tri :

91 => array:6 [
    0 => array:3 [
      "id" => 26154
      "filter_type" => 2
      "value" => "Conique"
    ]
    1 => array:3 [
      "id" => 26112
      "filter_type" => 2
      "value" => "Boule"
    ]
    2 => array:3 [
      "id" => 26113
      "filter_type" => 2
      "value" => "Poire"
    ]
    3 => array:3 [
      "id" => 26214
      "filter_type" => 2
      "value" => "Gilson"
    ]
    4 => array:3 [
      "id" => 26298
      "filter_type" => 2
      "value" => "Cylindrique"
    ]
    5 => array:3 [
      "id" => 25939
      "filter_type" => 2
      "value" => "De coulée"
    ]
  ]


Le code suivant va trier le tableau sur la clé "value"

$formattedAttributes = array_map(function($attributes) {
    $values = array_column($attributes, 'value');

    array_multisort($values, SORT_ASC, SORT_STRING, $attributes);

    return ($attributes);
}, $formattedAttributes);


Voici le résultat :

91 => array:6 [
    0 => array:3 [
      "id" => 26112
      "filter_type" => 2
      "value" => "Boule"
    ]
    1 => array:3 [
      "id" => 26154
      "filter_type" => 2
      "value" => "Conique"
    ]
    2 => array:3 [
      "id" => 26298
      "filter_type" => 2
      "value" => "Cylindrique"
    ]
    3 => array:3 [
      "id" => 25939
      "filter_type" => 2
      "value" => "De coulée"
    ]
    4 => array:3 [
      "id" => 26214
      "filter_type" => 2
      "value" => "Gilson"
    ]
    5 => array:3 [
      "id" => 26113
      "filter_type" => 2
      "value" => "Poire"
    ]
  ]


2ème exemple :

array:13 [▼
  2 => array:2 [▼
    "filter" => App\Models\Filter {#3431 ▶}
    "values" => array:6 [▼
      0 => array:2 [▼
        "value" => "Flacon"
        "count" => 1209
      ]
      1 => array:2 [▼
        "value" => "Pot"
        "count" => 126
      ]
      2 => array:2 [▼
        "value" => "Bidon"
        "count" => 94
      ]
      3 => array:2 [▼
        "value" => "Fût"
        "count" => 13
      ]
      4 => array:2 [▼
        "value" => "Bonbonne"
        "count" => 19
      ]
      5 => array:2 [▼
        "value" => "Jerrycan"
        "count" => 11
      ]
    ]
  ]


Le code suivant va trier le tableau sur la clé "value"

foreach ($listFilters as $key => $datum) {
    usort($datum['values'], static function ($a, $b) {
        return strcmp($a['value'], $b['value']);
    });

    $listFilters[$key]['values'] = $datum['values'];
}


Voici le résultat :

array:13 [▼
  2 => array:2 [▼
    "filter" => App\Models\Filter {#3431 ▶}
    "values" => array:6 [▼
      0 => array:2 [▼
        "value" => "Bidon"
        "count" => 94
      ]
      1 => array:2 [▼
        "value" => "Bonbonne"
        "count" => 19
      ]
      2 => array:2 [▼
        "value" => "Flacon"
        "count" => 1209
      ]
      3 => array:2 [▼
        "value" => "Fût"
        "count" => 13
      ]
      4 => array:2 [▼
        "value" => "Jerrycan"
        "count" => 11
      ]
      5 => array:2 [▼
        "value" => "Pot"
        "count" => 126
      ]
    ]
  ]


Cours rédigé par Vincent, publié le 05/07/2021