PHPで与えられたキーの順に連想配列を並べ替える方法

こんにちは、さるまりんです。

PHPの連想配列を与えられたキーの順に並べ替えたいと思います。

品物についてこんな連想配列があります。

$item = [
    'item_code' => 'A0305',
    'item_name' => 'りんご',
    'type_code' => 'T3',
    'type_name' => 'フルーツ',
    'origin'      => '青森',
    'color_code' => '003',
    'color_name' => '赤',
    'price'      => 300,
];

print_r()で出力するとこんな感じです。

Array
(
    [item_code] => A0305
    [item_name] => りんご
    [type_code] => T3
    [type_name] => フルーツ
    [origin] => 青森
    [color_code] => 003
    [color_name] => 赤
    [price] => 300
)

後で、品物にについて品種と在庫有無の情報を追加しました。

$item['variety'] = '紅玉';
$item['in_stock'] = true;

これをprint_r()で出力するとこうなります。

Array
(
    [item_code] => A0305
    [item_name] => りんご
    [type_code] => T3
    [type_name] => フルーツ
    [origin] => 青森
    [color_code] => 003
    [color_name] => 赤
    [price] => 300
    [variety] => 紅玉
    [in_stock] => 1
)

後から入れたものが最後に表示されていますね。

これを次の順に表示したいです。

item_code, item_name, type_code, type_name, color_code, color_name, variety, origin, price, in_stock

アルフベット順でもないし、数値の順でもない。
こんな場合はこうします。

$order = array_flip([並べたい順序のキーを含む配列]);
uksort($item, fn($a,$b) => $order[$a] <=> $order[$b]);

今回の例でやってみます。

$order = array_flip(explode(",", "item_code,item_name,type_code,type_name,color_code,color_name,variety,origin,price,in_stock"));
uksort($item, fn($a,$b) => $order[$a] <=> $order[$b]);

print_r()で再度出力すると

Array
(
    [item_code] => A0305
    [item_name] => りんご
    [type_code] => T3
    [type_name] => フルーツ
    [color_code] => 003
    [color_name] => 赤
    [variety] => 紅玉
    [origin] => 青森
    [price] => 300
    [in_stock] => 1
)

期待通り並べ替えられましたね。
上の例ではカンマ区切りのキーの文字列を分解し配列にしてarray_flip()関数に渡しています。

あまりすることはないかもしれないですが、例えばこの連想配列からJSONを作って返却するAPIで要素の順序を機にするときなどに利用できます。

読んでくださってありがとうございました。

それではまた!