php 数字の並び替えについて


複数桁の数値を、数の小さい順に並び替える、お勧めの方法を教えて下さい。

例 : 42315 → 12345
例 : 84519 → 14589

宜しくお願いします。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2017/01/07 14:10:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:soqans No.1

回答回数9ベストアンサー獲得回数3

ポイント100pt

第一感がtezcelloさんと同じだったのでサンプルを書いてみました。
5桁の整数を生成する処理はphp7で使用できるrandom_intを使っていますがそのほかはphp5以上であれば使用可能です。

//対象の数を生成
$num_target = random_int(0,99999);
print $num_target;

//生成された数を一桁ごとに文字(文字列)として分割
$num_array = str_split($num_target);

//対象を数としてソート
sort($num_array,SORT_NUMERIC);

//ソートされた配列を文字列として結合後整数に変換
$num_result = (int)implode($num_array);
print " " . $num_result . "\n";

なお数値中に0が入っていたときに並び替えた結果がどうなっていてほしいのか、によって最後の処理が微妙に異なります。たとえば56040という数値が与えられたときに表示される結果が

  • 00456となる、だと$num_result = implode($num_array);
  • 456となる、だと$num_result = (int)implode($num_array);

とするのがよいと思われます。

id:soqans

ちなみにphp以外の言語で文字の処理が不得意な言語では

  1. 各桁ごとに数をカウント
  2. 0方向から数値を連結

という古典的な方法をとることもあります。もしphpで書くなら

$num_target = random_int(0,99999);
print $num_target;

while($num_target != 0){
  $index = $num_target % 10;
  $count[$index]++;
  $num_target /= 10;
}
$num_result = 0;
for($index = 1;$index <= 9;$index++){
  if(isset($count[$index])){
    while($count[$index] > 0){
      $num_result *= 10;
      $num_result += $index;
      $count[$index]--;
    }
  }
}
print " " . $num_result . "\n";

となります。

が、こちらの方法だとphpでは回答で示した方法よりかなり遅いので参考程度にしてください。

2017/01/01 07:44:46
id:worldtravel

ありがとうございます。

とても参考になります。

使うとしましたら、こちらを使う予定です。
00456となる、だと$num_result = implode($num_array);

2017/01/02 22:30:27

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません