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

どう書く?.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すると、

1
2
3
4
5
6
Array
(
    [0] => 1.txt
    [2] => 2.txt
    [1] => 10.txt
)

こうなる。
 foreachで回すならこれで良いのですが、forで回す場合にはソートされていないように見えてしまいます。

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

1
2
3
4
5
6
7
8
9
10
function NaturalSort( &$target, $sw = FALSE )
{
  natcasesort( $target );
  if ( $sw ) {
    foreach ( $target as $value ) {
      $buf[] = $value;
    }
    $target = $buf;
  }
}

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

Related Posts

Comments are closed.