みやびです。PHPやMySQLを扱う人なら初期段階で遭遇するであろう数値のソートが気持ち悪い現象。あまり頻発する問題ではないため毎回どうやって戻すか忘れてしまう…。一応メモ。

つまずいたとこ

ウェブサイト制作時、特定のディレクトリ配下に存在する画像ファイル一覧をglobして配列で取得したときに再び遭遇。

はいでました!人間からすると非常に気持ち悪いですね。

文字列の左から順に[0-9]や[a-z]昇順なので、こういう結果になるのは仕方ないですが、もう少し気を利かせてくれては良いのではないだろうか…。

natcasesort()とかを使ってみる

実は上で紹介した並び順は、natsort関数やnatcasesort関数を使うことで自然な並び順に変えることができます。

2つの違いは、natcasesortは大文字・小文字の区別をつけないという特徴があります。

今回のケースではどっちでもいいです(笑)

まあそうなりますよね…想定の範囲内…!(笑)

array_values()やarray_merge()でキーの振り直し

値がキレイになったけどキーがバラバラになってしまったので、もう一度番号を振り直していきます。

実際はこのままforeach($images as $image)として突っ込んだら上から順に処理されるので、画像をimg_以下の番号順に表示したいのであれば、キーを振り直す必要は特にありません。

でも少し気持ち悪いので、ただの負担にしかなりませんが僕は並び替えします!

完了。気持ちいいいぃぃぃ!

array_mergeは配列の結合に使うケースが殆どかと思いますが、引数に配列を1つだけ入れるとキーの振り直しとしても使えます。
でも直感的にはarray_valuesの方が何をしてるかが分かりやすくていいですね。

根本的解決

そもそも論だけど、こんな面倒なことする前に、命名規則に数値を入れるときは、

「img_1, img_2, …, img_10」などではなく「img_01, img_02, …, img_10」のようにあらかじめ桁数を決めてゼロで埋めるように決めておくべきですね…。

そんな感じ。ぷちめもでした。

仕事そっちのけで記事を書いた人

プログラムしたりトレードしたりスケートしたりけん玉したりするひと。趣味はトライアンドエラー。優しいときもあれば厳しいときもある。寝不足を基本とする。

Comment

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。