前書き
タイトルで全て言った気がしますね。そこそこハマりやすい罠だと思います。
array_multisort()って?
連想配列のarray
を、中身の特定の要素に合わせてソーティングできる、とてもPHPらしい(と思う)便利関数です。
こちらの方の説明が詳しいです。
参考: PHPの多次元連想配列のソート - Qiita
キーが振り直される例
ソース
<?php
$students = array();
$students["1211"] = array(
'name'=>'山田花子',
'kana'=>'ヤマダハナコ',
);
$students["3139"] = array(
'name'=>'田中太郎',
'kana'=>'タナカタロウ',
);
echo "--ソート前--\n";
var_dump($students);
$kanas = array();
foreach ($students as $student) {
$kanas[] = $student['kana'];
}
array_multisort($kanas, SORT_ASC, $students);
echo "--結果--\n";
var_dump($students);
実行結果
--ソート前--
array(2) {
[1211]=>
array(2) {
["name"]=>
string(12) "山田花子"
["kana"]=>
string(18) "ヤマダハナコ"
}
[3139]=>
array(2) {
["name"]=>
string(12) "田中太郎"
["kana"]=>
string(18) "タナカタロウ"
}
}
--結果--
array(2) {
[0]=>
array(2) {
["name"]=>
string(12) "田中太郎"
["kana"]=>
string(18) "タナカタロウ"
}
[1]=>
array(2) {
["name"]=>
string(12) "山田花子"
["kana"]=>
string(18) "ヤマダハナコ"
}
}
解説
array_multisort()
関数は、「キーが数字だった場合、ソート順にキーを振り直す」という仕様があります。
これに加え、PHPのarray
は、「キーが数字の場合、int型に変換されたキーになる」という厄介な仕様があるため、「$students["1211"] = array(....)」
と文字列で指定しても、キーは数字と見なされます。
その結果、「文字列で入れたけど振り直された!」というバグの元が生まれます。
参考: PHPの配列のキーについて調べてみる - hnwの日記
参考: PHPで連想配列をforeachで回した時のkeyの型 - Qiita
あとがき
マニュアル読めと言われればその通りなんですが、私の場合、「ググる→出てこない→マニュアル読む」の順番なので、最初の「ググる」で出てきてほしい!という思いで書きました。