現在PHPを勉強中なのですが、ある問題に手こずっています。
「$a 配列内の最も頻出する要素を表示してください。最大出現要素が複数ある場合、そのうちのどれかを出力する」という質問です。
配列の内容は以下の通りです。
<php $a = [3, 2, 3, 1, 2, 6, 2, 8, 2];
画面に「2」と表示できるようにしたいです。
array_count_value関数とmax関数を使ってみたりもしましたが、出力したいのは最も重複した要素の値であって要素数ではありません。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/18 07:14
回答4件
0
array_count_value関数とmax関数を使ってみたりもしましたが、出力したいのは最も重複した要素の値であって要素数ではありません。
その求まった要素数を、array_count_values
の結果に対してarray_search
すれば良いです。
投稿2022/05/18 07:40
総合スコア84712
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/18 07:56
2022/05/18 08:07 編集
0
ベストアンサー
php
1<?php 2 3$a = [3, 2, 3, 1, 2, 6, 2, 8, 2]; 4$val = array_count_values($a); 5$mode = array_search(max($val), $val); 6 7echo $mode;
投稿2022/05/18 07:40
総合スコア19849
0
PHPの関数を覚えましょう。
特にPHPマニュアルにある配列の関数はブックマークに叩き込んでおき、
上から下まで全て閲覧して「あ、こんな用途で活用できそうだな」レベルで覚えておきましょう。
いざ配列操作しなければならないケースが出てきたらこのブックマークをさっと取り出して、
何を使えば簡単に実現出来るかな?と調査しましょう。
for文やforeach文を使えば何でも実現出来ますが、
コード内の文字数が増え、扱う変数が一気に増加するので
登場人物が多すぎで読みづらい粗悪な小説みたいになります。
配列にfor文使わされるのは負けくらいの気持ちで探しまくりましょう。
そのうちPHPでコード書かせれば最強クラスのエンジニアになれます。
まずカウントを数えなければなりません。
なのでarray_count_valuesで一度加工しましょう。
ただし、配列の添字として使える値は数値と文字列のみです。
今回は単なる数値だったので問題ありませんが状況に応じてどうするかを考える事になるでしょう。
php
1<php 2$a = [3, 2, 3, 1, 2, 6, 2, 8, 2]; 3$b = array_count_values($a); 4var_dump($b); 5// [3 => 2, 2 => 4, 1 => 1, 6 => 1, 8 => 1]
次に最も多い出現数のアイテムを取り出す必要があります。
ループを回して探しても良いですが、PHPの配列には内部ポインタやソートの機能が存在します。
降順ソートで最も多いものを先頭に持ってきつつ、内部ポインタを先頭に当てる
しかも添字はそのまま保持させるような関数である必要があります。
この条件にマッチするのはarsortになります。
php
1<php 2$a = [3, 2, 3, 1, 2, 6, 2, 8, 2]; 3$b = array_count_values($a); 4arsort($b); // 破壊的機能なので$bの配列が不可逆でぶっ壊される 5var_dump($b); 6// [2 => 4, 3 => 2, 1 => 1, 6 => 1, 8 => 1]
後はこの先頭にある2
を引き出せば完了となります。
currentでも行けそうな気がしますが、2
ではなく4
を返すので意味がない。
ここはkeyを使いましょう。
php
1<php 2$a = [3, 2, 3, 1, 2, 6, 2, 8, 2]; 3$b = array_count_values($a); 4arsort($b); 5$result = key($b); 6var_dump($result); 7// int(2)
投稿2022/05/18 07:45
総合スコア21158
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/18 07:48
2022/05/18 08:00
0
PHP
1$a = [3, 2, 3, 1, 2, 6, 2, 8, 2]; 2$b= array_flip(array_reduce($a,function($x,$y){ 3 if(!isset($x[$y])) $x[$y]=0; 4 $x[$y]++; 5 return $x; 6},[])); 7krsort($b); 8$c=array_shift($b); 9print_r($c);
投稿2022/05/18 07:30
総合スコア114968
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。