えーっと,よくわからないタイトルですが,ズバリ下みたいなことがしたかったです.
実現したいこと
$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] => 高坂 穂乃果
)
おー.出来てる…….
以上です!!
もっともっと賢いやり方がありそうな気配がするので,もしもあればコメント等是非お願いいたします.