dポイントプレゼントキャンペーン実施中!

配列(int)要素同士の合計、割り算は、どうやってするのでしょうか?

■元データ
Array a 
(
  [2] => 2
  [1] => 4
  [3] => 1
)
Array b
(
  [1] => 2
  [2] => 2
  [3] => 1
)

■導きたい結果1 … キーが同じ場合に、aとbの合計したい
Array c
(
  [1] => 6
  [2] => 4
  [3] => 2
)

■導きたい結果2 … キーが同じ場合に、aをcで割りたい(そして、✕100・四捨五入したい)
Array d
(
  [1] => 67 4/6=0.666
  [2] => 50 2/4
  [3] => 50 1/2
)

A 回答 (2件)

配列操作関数に渡して一発でいけるかとおもいきや、ちょっとそういう方法が思い浮かばなかったのでこれで。


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);
?>

この回答への補足

回答ありがとうございました。
おかげで望む結果を得ることができました。

出来たのですが、コード内容で分からないことがあるので、教えてください。
>配列のkeyの一致するところだけ
というのは、「if (array_key_exists($key, $input1)) {」を指すのでしょうか?

array_key_exists関数は指定キー/添字が存在しているかどうか確認するもので、
存在していても必ずしも一致しているとは限らないとも思うのですが、
どうしてこれで、望む結果が得られているのでしょうか?
foreachの中で利用しているので、存在さえしていれば、総当りで処理するので、必ず一致するところとぶち当たるということなのでしょうか?

補足日時:2012/09/24 12:45
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

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

お礼日時:2012/09/25 10:04

> >配列の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の要素にあるかチェックされます。
    • good
    • 0
この回答へのお礼

大変詳しい説明ありがとうございました

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

お礼日時:2012/09/25 10:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!