『数字混じり文字列ソート』投稿

どう書く?.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すると、
[cc lang=”PHP”]
Array
(
[0] => 1.txt
[2] => 2.txt
[1] => 10.txt
)
[/cc]
こうなる。
 foreachで回すならこれで良いのですが、forで回す場合にはソートされていないように見えてしまいます。

 このため、お題の回答は以下にしました。
 第2パラメータを省略またはFALSEを渡せばnatcasesort()と同等、TRUEでキーの関係を保持しない結果となります。

[cc lang=”PHP”]
function NaturalSort( &$target, $sw = FALSE )
{
natcasesort( $target );
if ( $sw ) {
foreach ( $target as $value ) {
$buf[] = $value;
}
$target = $buf;
}
}
[/cc]

投稿:
http://ja.doukaku.org/comment/21159/
PHP Rank:10(74.6%)

Related Posts

Comments are closed.