Menu
Coddy logo textTech

自然順序ソート

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() は元の配列を直接変更します。これにより、ファイルリストやバージョン番号、あるいは文字列の中に数値が含まれており、それをアルファベット順ではなく数値順でソートする必要があるデータの整理に特に役立ちます。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

challenge icon

チャレンジ

簡単

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);
?>
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理とフローのすべてのレッスン