こんにちは、さるまりんです。
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で要素の順序を機にするときなどに利用できます。
読んでくださってありがとうございました。
それではまた!