質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

534閲覧

配列内の最も頻出する要素を取得したい。

hee

総合スコア15

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/05/18 07:03

編集2022/05/18 07:16

現在PHPを勉強中なのですが、ある問題に手こずっています。
「$a 配列内の最も頻出する要素を表示してください。最大出現要素が複数ある場合、そのうちのどれかを出力する」という質問です。

配列の内容は以下の通りです。

<php $a = [3, 2, 3, 1, 2, 6, 2, 8, 2];

画面に「2」と表示できるようにしたいです。

array_count_value関数とmax関数を使ってみたりもしましたが、出力したいのは最も重複した要素の値であって要素数ではありません。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2022/05/18 07:12

頻出する要素が複数あった場合はどうするのでしょう?
hee

2022/05/18 07:14

すみません、問題文が足りてませんでした汗 問題文には「最大出現要素が複数ある場合、そのうちどれかを出力する」とあります。
guest

回答4

0

array_count_value関数とmax関数を使ってみたりもしましたが、出力したいのは最も重複した要素の値であって要素数ではありません。

その求まった要素数を、array_count_valuesの結果に対してarray_searchすれば良いです。

投稿2022/05/18 07:40

otn

総合スコア84712

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hee

2022/05/18 07:56

ご回答ありがとうございます! PHPが元々持っている関数たちを把握できていなかったので、これからより一層学んでいこうと思いました! ありがとうございました!
otn

2022/05/18 08:07 編集

PHPの関数は多くて、かつ、雑多であり、すべてを把握するのは無理なので、 都度、「こういう関数があるはずだ」と関数一覧から探します。 今回は、https://www.php.net/manual/ja/book.array.php の中にあるはずです。
guest

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

melian

総合スコア19849

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hee

2022/05/18 08:02

ご回答ありがとうございます! 他の回答者様のコードもわかりやすかったのですが、melian様のコードが一番初見で理解しやすかったです。 本当にご回答ありがとうございました!
guest

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

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi-sun

2022/05/18 07:48

他回答なるほど…… ソートかませるより、ダイレクトに最大値を探しに行くほうが計算量少なくて済むなぁ 負けた
hee

2022/05/18 08:00

実装に至るまでの考え方から実際にコードを書くところまで詳細にご説明いただきありがとうございました! 他の回答者様にも申したのですが、PHPが元々持っている関数たちを種類や用途も含めてまったく把握できていませんでした。 ですのでmiyabi-sun様のおっしゃった通り、PHPの関数を一つずつ確認していこうと思います。 改めましてご回答ありがとうございました!
guest

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

yambejp

総合スコア114968

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hee

2022/05/18 07:54

最速のご回答ありがとうございます! まだ僕が駆け出しのエンジニアということもあり、正直yambejp様のコードを難しいと感じてしまいました。 ですが、これからも勉強を継続していかなければと再認識できるきっかけになりました! あらためましてご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問