LoginSignup
0
0

More than 5 years have passed since last update.

PHPのarray_multisort()はキーが数字の場合には、新しく振り直される

Posted at

前書き

タイトルで全て言った気がしますね。そこそこハマりやすい罠だと思います。

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

あとがき

マニュアル読めと言われればその通りなんですが、私の場合、「ググる→出てこない→マニュアル読む」の順番なので、最初の「ググる」で出てきてほしい!という思いで書きました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0