• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列(int)要素同士の合計、割り算)

配列要素同士の合計と割り算方法

このQ&Aのポイント
  • 配列の要素同士を合計する方法と割り算する方法について説明します。
  • 配列の要素を合計した結果を新たな配列に格納する方法について説明します。
  • 配列の要素を合計し、その結果を元の配列の要素で割る方法について説明します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

配列操作関数に渡して一発でいけるかとおもいきや、ちょっとそういう方法が思い浮かばなかったのでこれで。 PHPでは関数がファーストクラスだと思うので、関数と配列2つを引数に取る関数を作り、配列のkeyの一致するところだけその関数を適用して、それを返すようにすれば良いのではないかと。 例えば、こんなかんじでどうでしょう? あと、適当な関数名が思いつきませんでしたので、関数名は微妙ですが。 <?php $a = array( 2 => 2, 1 => 4, 3 => 1, ); $b = array( 1 => 2, 2 => 2, 3 => 1, ); function array_calc($operator, $input0, $input1) { $output = array(); foreach ($input0 as $key => $value) { if (array_key_exists($key, $input1)) { $output[$key] = $operator($input0[$key], $input1[$key]); } } return $output; } function my_plus($i0, $i1) { return $i0 + $i1; } function my_div_time100($i0, $i1) { return round($i0 * 100 / $i1); } $c = array_calc(my_plus, $a, $b); print_r($c); $d = array_calc(my_div_time100, $a, $c); print_r($d); ?>

re999
質問者

お礼

回答ありがとうございました。 >関数と配列2つを引数に取る関数を作り こういう書き方も出来るんだな、と初めて知りました。 また、「ファーストクラス」という考え方と言うか、言葉自体初めて聞いたので検索してみたのですが、興味深く感じ、大変勉強になりましたー

re999
質問者

補足

回答ありがとうございました。 おかげで望む結果を得ることができました。 出来たのですが、コード内容で分からないことがあるので、教えてください。 >配列のkeyの一致するところだけ というのは、「if (array_key_exists($key, $input1)) {」を指すのでしょうか? array_key_exists関数は指定キー/添字が存在しているかどうか確認するもので、 存在していても必ずしも一致しているとは限らないとも思うのですが、 どうしてこれで、望む結果が得られているのでしょうか? foreachの中で利用しているので、存在さえしていれば、総当りで処理するので、必ず一致するところとぶち当たるということなのでしょうか?

その他の回答 (1)

回答No.2

> >配列のkeyの一致するところだけ > というのは、「if (array_key_exists($key, $input1)) {」を指すのでしょうか? それが半分です。 foreachとその部分の組み合わせです。 > array_key_exists関数は指定キー/添字が存在しているかどうか確認するもので、 > 存在していても必ずしも一致しているとは限らないとも思うのですが、 > どうしてこれで、望む結果が得られているのでしょうか? > foreachの中で利用しているので、存在さえしていれば、総当りで処理するので、必ず一致するところとぶち当たるということなのでしょうか? その通りです。 foreachループで配列input0の要素 (キーとその値) を1つずつ取り出しています。言い換えると、ここで取り出した要素のキーはかならずinput0にあります。array_key_existsではそのキーがinput1のキーとして存在しているか調べているので、input0にあるキーがinput1にもある場合のみarray_key_existsがtrueになります。 input1にあるキーがinput0にない場合、foreachではそのキーは出現しませんので、それを使ってarray_key_existsを呼び出す事自体が起こりえません。 なお、foreachで処理をするので、input0の要素は総当たりで取り出されます。つまり、input0にある要素は必ずarray_key_existsでinput1の要素にあるかチェックされます。

re999
質問者

お礼

大変詳しい説明ありがとうございました >存在しているか調べているので、input0にあるキーがinput1にもある場合のみarray_key_existsがtrue >input1にあるキーがinput0にない場合、foreachではそのキーは出現しませんので、 >それを使ってarray_key_existsを呼び出す事自体が起こりえません よく分かりました。おかげでスッキリしました!

関連するQ&A