lalala_s
@lalala_s (shun)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

教えてPHP

Discussion

解決したいこと

配列の中の数値で一番大きい数字を作る

phpで配列の中の数値で一番大きい数字を作る処理を書きたいと思っています。

ここから、配列の順番だけではなく、数値自体を降順にしたいのですが処理の入り口が思いつきません。
何か良い方法があればご教授ください。

該当するソースコード

$array = [10 , 28, 25, 62, 93, 34, 2626];

bubble($array);

function bubble(&$array) {
    $n = count($array);
    for($i = 0; $i < $n; $i++){
        for ($j = 0; $j < ($n - 1 - $i); $j++) {
            if ($array[$j + 1] > $array[$j]) {
                $tmp = $array[$j + 1];
                $array[$j + 1] = $array[$j];
                $array[$j] = $tmp;
            }
        }
    }
}

echo implode($array);
0

申し訳ございません。
「phpで配列の中の数値で一番大きい数字を作る」という言葉の意味がわかりませんでしたので、
補足説明をお願いしてもよろしいでしょうか。

配列に含まれる数値を使い、何か計算処理を行うという事ですか?

1Like
$array = [10 , 28, 25, 62, 93, 34, 2626];

// 降順
rsort($array);

// 一番大きい数値
$array[0];

// 合計値
array_sum($array);

1Like

@FAL_neighbor
返信ありがとうございます。
言葉の意味について申し訳ございません。語彙力が、、、、
補足の説明として、
配列に[9,478,82,61,27]が入っていたとすると、この配列の値を使って一番大きい値
(988776421)を弾き出したい処理を作りたいと思っています。

載せたソースコード(バブルソート)アルゴリズムを使って配列の順列は弾き出せたのですが、、、
478,82,61,27,9というようにインデックスの中身が大きい順になってしまいます。

特段、計算処理などはなしで、ただ配列の数字を組み替えて大きい数字を作る処理を書きたいなと思っています。

長くなってしまい申し訳ございません。。

0Like

@geerpm
ありがとうございます。
申し訳ございません。私の語彙力が皆無で。。。。

配列に[9,478,82,61,27]が入っていたとすると、この配列の値を使って一番大きい値
(988776421)を弾き出したいんです。。

0Like

なるほど。詳細ありがとうございます。
こんなのはどうでしょう。

usort($array, function ($a, $b) {
    $keta = max(strlen("$a"), strlen("$b"));
    return (int)sprintf("%-0{$keta}s", $b) <=> (int)sprintf("%-0{$keta}s", $a);
});
  1. usort で自前callback配列ソート
  2. callback内で、2値の桁($keta)算出
  3. sprintf "%-0{$keta}s" で後ろ0埋めで $keta に揃えて、intキャストして比較。降順にするために $bが左辺
1Like

あ、配列内の要素は1桁ずつ分解する感じですかね。でしたら

$res = array_reduce(array_map(function ($num) {
    return str_split("$num", 1);
}, $array), function ($carry, $row) {
    return [...$carry, ...$row];
}, []);

とかでいけるかな。この後に上のusortかければ降順のデータが得られると思います
$array にもとの数字配列を渡す感じです。

1Like

@geerpm 感謝感激です。

$array = [10 , 28, 25, 62, 93, 34, 2626];

$array = array_reduce(array_map(function ($num) {
    return str_split("$num", 1);
}, $array), function ($carry, $row) {
    return [...$carry, ...$row];
}, []);

usort($array, function ($a, $b) {
    $keta = max(strlen("$a"), strlen("$b"));
    return (int)sprintf("%-0{$keta}s", $b) <=> (int)sprintf("%-0{$keta}s", $a);
});

echo implode($array);


0Like

(コメント消えちゃってますが通知来てたので回答しときます。)
usortやarray_reduceはリスト操作で割と使い所あるので知っとくと便利だと思います。
javascriptや他の言語でも同じような関数が用意されているのでphpに限らず使う機会あります。

1Like

Your answer might help someone💌