自然順序ソート
CoddyのPHPジャーニー「論理とフロー」セクションの一部 — レッスン 24/68。
PHPの標準的なソート関数は、ほとんどの場合うまく機能しますが、数値を含む文字列をソートする際に予期しない結果を生じることがあります。natsort() 関数は、人間が自然に期待するような方法で文字列をソートする「自然順序」アルゴリズムを使用することで、この問題を解決します。
ファイル名を使用した次の例を考えてみましょう:
<?php
$files = ["file1.txt", "file10.txt", "file2.txt", "file20.txt"];
// 通常の sort() の結果: file1.txt, file10.txt, file2.txt, file20.txt
sort($files);
print_r($files);
// 配列をリセットします
$files = ["file1.txt", "file10.txt", "file2.txt", "file20.txt"];
// natsort() の結果: file1.txt, file2.txt, file10.txt, file20.txt
natsort($files);
print_r($files);
?>違いは極めて重要です。通常の sort() は文字列を1文字ずつ比較するため、ASCIIでは "1" が "2" よりも前に来ることから、"file10.txt" は "file2.txt" よりも前に配置されます。しかし、natsort() は数値部分を認識して数値としてソートするため、自然に期待される通り、"file2.txt" を "file10.txt" の前に配置します。
他のPHPソート関数と同様に、natsort() は元の配列を直接変更します。これにより、ファイルリストやバージョン番号、あるいは文字列の中に数値が含まれており、それをアルファベット順ではなく数値順でソートする必要があるデータの整理に特に役立ちます。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単1つの入力を受け取ります。それはJSON形式のソフトウェアバージョン番号の配列です。入力を読み込み、JSON文字列を配列に変換し、natsort() を使用してバージョン番号を自然順(natural order)でソートし、ソートされた配列を print_r() を使用して出力してください。
入力形式: バージョン文字列のJSON配列を含む1行(例: ["v1.10","v1.2","v1.20","v1.3"])
期待される出力: print_r() を使用して表示された、自然順でソートされた配列
チートシート
natsort() 関数は、「自然順序」を使用して文字列をソートします。これは、人間が数値を含む文字列をソートする際に自然に期待する形式です。
通常の sort() は文字列を1文字ずつ比較しますが、natsort() は数値部分を認識し、それらを数値としてソートします:
$files = ["file1.txt", "file10.txt", "file2.txt", "file20.txt"];
// 通常の sort() の結果: file1.txt, file10.txt, file2.txt, file20.txt
sort($files);
// natsort() の結果: file1.txt, file2.txt, file10.txt, file20.txt
natsort($files);
print_r($files);他の PHP ソート関数と同様に、natsort() は元の配列を直接変更します。これは、ファイルの一覧、バージョン番号、または数値的にソートされるべき数値が埋め込まれたデータに特に便利です。
自分で試してみよう
<?php
// 入力を読み込む
$input = fgets(STDIN);
// JSON文字列を配列に変換する
$versions = (array)json_decode($input, true);
// TODO: natsort()を使用して配列をソートするコードを以下に記述してください
// ソートされた配列を出力する
print_r($versions);
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。