array_flip()とuksort()の応用。
CSV作成でよく使う🐱
<?php require_once("../vendor/autoload.php"); use Illuminate\Support\Arr; // ソート用キー $sort_keys = [ 'id', 'name', 'password', 'skill', 'role', 'note', ]; // 対象データ $users = [ [ 'note' => "管理者だよ", 'role' => "Admin", 'password' => "xxxxx", 'skill' => "IT", 'name' => "優さん", 'id' => 1, 'BAD_KEY' => "想定しないキーと値だよ🐱" ], [ 'name' => "田中っち", 'note' => "", 'password' => "yyyyy", 'skill' => "Actor", 'id' => 2, 'role' => "Member", ], [ 'password' => "zzzzz", 'id' => 3, 'note' => "", 'skill' => "Actor", 'role' => "Guest", 'name' => "木村", ], ]; /** * 配列を任意のソートキー配列でソートして返却 * * @param array $data * @param array $sort_keys * @return array */ function ukSortBySortKeys(array $data, array $sort_keys): array { // ソート用にkeyとvalueを反転させる $flipped_sort_keys = array_flip($sort_keys); // array(6) { // ["id"]=> // int(0) // ["name"]=> // int(1) // ["password"]=> // int(2) // ["skill"]=> // int(3) // ["role"]=> // int(4) // ["note"]=> // int(5) // } $sorted_data = []; foreach ($data as $datum) { // 想定しないデータを除去する $datum = Arr::only($datum, $sort_keys); // ソート // @see https://www.php.net/manual/ja/function.uksort.php uksort($datum, function ($x, $y) use ($flipped_sort_keys) { if ($flipped_sort_keys[$x] === $flipped_sort_keys[$y]) { return 0; } return ($flipped_sort_keys[$x] > $flipped_sort_keys[$y]) ? 1 : -1; }); $sorted_data[$datum['id']] = $datum; } return $sorted_data; } // 実行 var_dump(ukSortBySortKeys($users, $sort_keys)); // array(3) { // [1]=> // array(6) { // ["id"]=> // int(1) // ["name"]=> // string(9) "優さん" // ["password"]=> // string(5) "xxxxx" // ["skill"]=> // string(2) "IT" // ["role"]=> // string(5) "Admin" // ["note"]=> // string(15) "管理者だよ" // } // [2]=> // array(6) { // ["id"]=> // int(2) // ["name"]=> // string(12) "田中っち" // ["password"]=> // string(5) "yyyyy" // ["skill"]=> // string(5) "Actor" // ["role"]=> // string(6) "Member" // ["note"]=> // string(0) "" // } // [3]=> // array(6) { // ["id"]=> // int(3) // ["name"]=> // string(6) "木村" // ["password"]=> // string(5) "zzzzz" // ["skill"]=> // string(5) "Actor" // ["role"]=> // string(5) "Guest" // ["note"]=> // string(0) "" // } // }