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

どう書く?.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;  
  }  
}

投稿:

http://ja.doukaku.org/comment/21159/