LoginSignup
7
4

More than 5 years have passed since last update.

PHPで配列内を重複ワード数順にソートしつつ,重複ワードを消す

Last updated at Posted at 2016-11-16

えーっと,よくわからないタイトルですが,ズバリ下みたいなことがしたかったです.

実現したいこと

$array = array(
    '1',
    '1',
    '2',
    '2',
    '2',
    '2',
    '3',
    '3',
    '3'
);

みたいな配列があるとき

Array
(
    [0] => 2  // 2が4つあって一番多いよね
    [1] => 3  // 次に多いのが3つある3だよね
    [2] => 1  // 最後に多かったのは1でした
)

という配列を作りたい!!

いくら様々な配列操作を行える関数を用意しているPHPといえど,こういうことは用意されている関数一つでパッとは出来まい…….
あれ? 出来ないよね?
というか検索してもこういう処理がなかなか見付からなかった(そもそもやろうとしている人がいない?)のでロジックを作ってみました.

作ってみた

// sort用に重複数をカウントしつつ配列のkeyに元となるvalueを入れる
foreach ((array) $array as $value) {
    if (isset($sort[$value])) {
        ++$sort[$value];
    } else {
        $sort[$value] = 1;
    }
}

// ソート
arsort($sort);

// 元となるvalueを添字から復元
foreach ((array) $sort as $key => $value) {
    $return[] = $key;
}
print_r($return);

どうでしょうか……?

これを使うことで,例えば投票システム?とかでも投票された順に配列に詰めるだけで順位は出せますよね(何票だったかは出す必要がない場合).
また,今までに入力されたデータをザッと配列に出しちゃえば利用頻度の高かったデータ順に候補配列を作ったり……とかも出来そうだし便利じゃないかな!?

いや,わざわざ作る必要なかった……

(コメントよりarray_count_valuesを使用した例を頂きましたのでこちらにも載せておきます.)

$counts = array_count_values($array);
arsort($counts);
$return = array_keys($counts);
print_r($return);

ビックリする程簡単でわかりやすくなっている…….
このQiita記事も必要なかったんじゃないのかレベルですわ.
教えて頂きありがとうございました!!

テストしてみる

<?php

$array = array(
    '高坂 穂乃果',
    '南 ことり',
    '園田 海未',
    '南 ことり',
    '園田 海未',
    '南 ことり',
    '高坂 穂乃果',
    '南 ことり',
    '園田 海未',
    '園田 海未',
    '南 ことり',
    '高坂 穂乃果',
    '南 ことり',
    '園田 海未',
);

foreach ((array) $array as $value) {
    if (isset($sort[$value])) {
        ++$sort[$value];
    } else {
        $sort[$value] = 1;
    }
}
arsort($sort);
foreach ((array) $sort as $key => $value) {
    $return[] = $key;
}
print_r($return);

何かの投票結果を$arrayに雑にそのままブチ込んだと仮定して,先程の処理を行います.

Array
(
    [0] =>  ことり
    [1] => 園田 海未
    [2] => 高坂 穂乃果
)

おー.出来てる…….

以上です!!

もっともっと賢いやり方がありそうな気配がするので,もしもあればコメント等是非お願いいたします.

7
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4