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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,951
退会済みユーザー

退会済みユーザー

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

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

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

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

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

$fuge_1 = 3800/2; 
//$fuga_1の「1」は$numの「1」、
//3800は$hogeの後の「2000」と「1800」の和
//2は$hogeの値の中に「1」が2回あるから

echo $fuge_1; // 1900

//同様に$hogeの値に「2」が1箇所あり、また$numの配列にも「2」があるので
$fuge_2 = 2100/1;
echo $fuga_2; //2100

//また$numの中に3があるにも関わらず、$hogeの値の中に「3」はないので、
$fuga_3 = 0;
echo $fuga_3;  //0

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

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

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





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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

//計算用の配列
$count = array();

//$numを要素の数だけループ
foreach($num as $num_val){
   
    //ループ中の要素の値が$hogeに含まれているか確認
    if(in_array($num_val,$hoge) ===  true){

         //その中で$hogeをループさせて中身を走査
             foreach($hoge as $hoge_key => $hoge_val){
                  //$hogeの走査中の値が$numの走査中の値と同じなら、一つ次の値を確保
                  if($hoge_val == $num_val ){
                          $count[$num_val] = $count[$num_val] + $hoge[$hoge_key + 1];
      }
            }

    }else{
                         $count[$num_val] = 0;
    }

  }

//numの中のそれぞれの数字の登場回数をカウント
$num_count_values = array_count_values($num);

//カウント用の配列を使って計算
foreach($count as $count_key => $count_val){
    if($count_val == 0){
         ${"fuge_".$count_key} = 0;
    }else{
      //可変変数でfuge_nを定義
       ${"fuge_".$count_key} = $count_val / $num_count_values[$count_key] ;
    }
}

echo $fuge_1;
echo $fuge_2;
echo $fuge_3;

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

例えばこんな感じでしょうか。
使用しているのは全て標準関数なので、使い方は検索してみてください。
//numのキーに単純配列で値の配列が入る形で定義する。
//入力形式が既に固定なら、この形になるように変換する。
$hoge = array(
   1 => array(2000,1800),
   2 => array(2100),
);

foreach($num as $num_val){
    //numの値が$hogeの添え字にあるか確認
    if(array_key_exists($num_val,$hoge )){
         //ある場合は配列の値を合計して要素数で平均を取る
         $fuga[$num_val] = array_sum($hoge[$num_val])/count($hoge[$num_val]);
    }else{
         $fuga[$num_val] = 0;
    }
}


//出力
foreach($fuga as $fuga_key => $fuga_val){
     echo $fuga_key .":".$fuga_val;
}
みたいな感じでしょうか。



投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/27 15:37

    大変丁寧な解説頂きありがとうございます。

    2次元配列、連想配列、いろいろ配列にも種類があるんですね。
    配列よく勉強してみます。

    上記の記述に少し改変をいれ使わせて頂き、無事にできました!
    ありがとうございます。

    キャンセル

0

<?php
  $result = 0;
  foreach ( array_keys( $hoge, $num ) as $key ) {
    $result += $hoge[ $key + 1 ];
  }

  echo $result;
?>

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る