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

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

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

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

Q&A

解決済

2回答

3183閲覧

複数の配列の一部の値を比較する PHP

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2015/10/26 14:47

やりたい事をうまく言えなかったのでタイトルが分かりにくくなってしまい申し訳ありません。

2つの配列があります。

PHP

1print_r($num); //こちらも固定ではないですが、値が連番で入ってきます。 1,2,3,4と値が4つかもしれないということです。 2Array 3( 4 [0] => 1 5 [1] => 2 6 [2] => 3 7) 8print_r($hoge); //こちらの配列の値は固定ではありません。 $hoge[0] = 2;になるかもしれないという意味です。 9Array 10( 11 [0] => 1 12 [1] => 2000 13 [2] => 2 14 [3] => 2100 15 [4] => 1 16 [5] => 1800 17)

$hogeの配列の値(1,2000,2,2100...)から$numの値に等しかったら、
$hogeの一致する値の次の値を合計して表示するということをしたいです。

今回の例だと、$hogeの値に「1」が2箇所あります。
また、$numの配列にも「1」があるので次の処理に進みます。(条件分岐?)

処理が進んだ時に、$hogeの「1」の後の「2000」と「1800」の値を合計して、以下のようにしたいです。

PHP

1$fuge_1 = 3800/2; 2//$fuga_1の「1」は$numの「1」、 3//3800は$hogeの後の「2000」と「1800」の和 4//2は$hogeの値の中に「1」が2回あるから 5 6echo $fuge_1; // 1900 7 8//同様に$hogeの値に「2」が1箇所あり、また$numの配列にも「2」があるので 9$fuge_2 = 2100/1; 10echo $fuga_2; //2100 11 12//また$numの中に3があるにも関わらず、$hogeの値の中に「3」はないので、 13$fuga_3 = 0; 14echo $fuga_3; //0

このように処理結果が来るようにしたいです。

for文を使って試行錯誤しながら実装してみたのですが、
上記のような処理結果には至っていません。

ご教授の頂けますと幸いです!

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

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

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

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

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

guest

回答2

0

ベストアンサー

単純に実装すると以下の様な形になると思います。
デバッグしていないのでエラーが出るかもしれませんが。

PHP

1 2//計算用の配列 3$count = array(); 4 5//$numを要素の数だけループ 6foreach($num as $num_val){ 7 8 //ループ中の要素の値が$hogeに含まれているか確認 9 if(in_array($num_val,$hoge) === true){ 10 11 //その中で$hogeをループさせて中身を走査 12 foreach($hoge as $hoge_key => $hoge_val){ 13 //$hogeの走査中の値が$numの走査中の値と同じなら、一つ次の値を確保 14 if($hoge_val == $num_val ){ 15 $count[$num_val] = $count[$num_val] + $hoge[$hoge_key + 1]; 16 } 17 } 18 19 }else{ 20 $count[$num_val] = 0; 21 } 22 23 } 24 25//numの中のそれぞれの数字の登場回数をカウント 26$num_count_values = array_count_values($num); 27 28//カウント用の配列を使って計算 29foreach($count as $count_key => $count_val){ 30 if($count_val == 0){ 31 ${"fuge_".$count_key} = 0; 32 }else{ 33 //可変変数でfuge_nを定義 34 ${"fuge_".$count_key} = $count_val / $num_count_values[$count_key] ; 35 } 36} 37 38echo $fuge_1; 39echo $fuge_2; 40echo $fuge_3; 41 42

が、バグが発生しやすく分かりにく実装になってしまいます。
例えば、$hogeに計算したい値として1が入った場合にはどうにもなりません。
$hogeの配列のデータ構造を先に(出来れば配列を作るタイミング)で修正する方がいいです。
キーワードとしては、2次元配列と連想配列になります。
ついでにfugaも配列にして出力を簡単にしましょう。

例えばこんな感じでしょうか。
使用しているのは全て標準関数なので、使い方は検索してみてください。

PHP

1//numのキーに単純配列で値の配列が入る形で定義する。 2//入力形式が既に固定なら、この形になるように変換する。 3$hoge = array( 4 1 => array(2000,1800), 5 2 => array(2100), 6); 7 8foreach($num as $num_val){ 9 //numの値が$hogeの添え字にあるか確認 10 if(array_key_exists($num_val,$hoge )){ 11 //ある場合は配列の値を合計して要素数で平均を取る 12 $fuga[$num_val] = array_sum($hoge[$num_val])/count($hoge[$num_val]); 13 }else{ 14 $fuga[$num_val] = 0; 15 } 16} 17 18 19//出力 20foreach($fuga as $fuga_key => $fuga_val){ 21 echo $fuga_key .":".$fuga_val; 22} 23

みたいな感じでしょうか。

投稿2015/10/26 16:08

tanat

総合スコア18709

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

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

退会済みユーザー

退会済みユーザー

2015/10/27 06:37

大変丁寧な解説頂きありがとうございます。 2次元配列、連想配列、いろいろ配列にも種類があるんですね。 配列よく勉強してみます。 上記の記述に少し改変をいれ使わせて頂き、無事にできました! ありがとうございます。
guest

0

PHP

1<?php 2 $result = 0; 3 foreach ( array_keys( $hoge, $num ) as $key ) { 4 $result += $hoge[ $key + 1 ]; 5 } 6 7 echo $result; 8?>

俺だったらデータ構造から見直す

投稿2015/10/26 16:37

miya

総合スコア81

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問