『数字混じり文字列ソート』投稿
『どう書く?.org』に投稿。
お題はこちら。
自然順アルゴリズムで配列をソートしてくださいというものです。
例えば、1.txt, 10.txt, 2.txtであれば、1.txt, 10.txt, 2.txt ではなく、1.txt, 2.txt, 10.txt というように。
PHPではnatcasesort()という要求そのままの関数が存在するのですが(大文字小文字を区別するならnatsort()です)、この関数はキーの関係を保持してソートするため、キーを持たない配列をソートした場合に期待した結果になりません。
例えば、
$a = array( ‘1.txt’, ’10.txt’, ‘2.txt’ );
この配列をnatcasesortすると、
Array
(
[0] => 1.txt
[2] => 2.txt
[1] => 10.txt
)
こうなる。 foreachで回すならこれで良いのですが、forで回す場合にはソートされていないように見えてしまいます。
このため、お題の回答は以下にしました。 第2パラメータを省略またはFALSEを渡せばnatcasesort()と同等、TRUEでキーの関係を保持しない結果となります。
function NaturalSort( &$target, $sw = FALSE )
{
natcasesort( $target );
if ( $sw ) {
foreach ( $target as $value ) {
$buf[] = $value;
}
$target = $buf;
}
}
投稿: