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

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

配列(int)要素同士の合計、割り算

配列(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 )

  • re999
  • お礼率61% (476/777)
  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
回答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

  • 配列から別の配列の要素を削除する方法

    ある配列array_aに、100件の文字列要素が格納されています。 別の配列array_bには、80件の文字列要素が格納されています。 array_aの要素、array_bの要素共に重複するものはありません。 array_b中に存在する要素はすべてarray_a中にも存在します。 array_aにあり、array_bにはない要素で構成されたarray_cの作り方を教えてください。 例えば $array_a=array("a","b","c","d","e","f","g"); $array_b=array("e","b","d"); なら、 $array_c=array("a","c","f","g") になります。 配列array_aとarray_bは、 $array_b=array("b","b","d"); であったり、 $array_a=array("a","a","b","c","d","e","f","g"); といった「重複する要素を含むパターン」はありません。要素はすべてユニークです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 特定の要素を抜き取って連想配列へ

    例えば、 $hoge = "%_A_%あ%_A_%%_B_%123%_B_%%_C_%%_C_%%_D_%hogehoge%_D_%"; というようなデータがあった場合、 %_?_% の?部分を連想配列のキーとして、 そのはさまれた部分を前途キーの内容として格納したいのですが、 どのようにすればいいでしょうか? (%_?_%~%_?_% において?の組み合わせは必ず単一でしか存在しません) 求めている結果は $array['A'] => あ $array['B'] => 123 $array['C'] => //空要素 $array['D'] => hogehoge のような形です とりあえず if (preg_match("/%_([A-Z])_%(.*)%_$1_%/" , $hoge ,$matched) ){ // $matchedを解析して$arrayに割り当て } とすればいけるかな、と思いやってみましたがパターンマッチの条件にすら当てはまらず撃沈 preg_matchのマッチ条件内ではまだ$1が使えないようでした 環境はPHP4です よろしくお願いします

    • ベストアンサー
    • PHP
  • 2つの配列/キーが一致する際、要素数の出現回数を求

    2つの配列があり、かつキーが一致する際、要素数の出現回数を求めたいのですが、 どうすれば良いでしょうか? 具体的には、下記「a、b」より「c、d」を導き出したいです ■元データ( a、b キーは対応) Array a (   [0] => 1   [1] => 2   [2] => 2   [3] => 1   [4] => 3   [5] => 1   [6] => 2   [7] => 2   [8] => 3   [9] => 1 ) Array b (   [0] => 0   [1] => 1   [2] => 0   [3] => 1   [4] => 1   [5] => 1   [6] => 1   [7] => 0   [8] => 2   [9] => 1 ) ■欲しい結果 Array c … 「Array b」が1の時の、「Array a」の値の出現回数(キーは「Array a」の値) (   [1] => 3   [2] => 2   [3] => 1 ) Array d … 「Array b」が1以外(0または2)の時の、「Array a」の値の出現回数(キーは「Array a」の値) (   [2] => 2   [1] => 1   [3] => 1 ) ■備考 「Array b」が1の時の「Array a」   [1] => 2   [3] => 1   [4] => 3   [5] => 1   [6] => 2   [9] => 1 ・1が3回 ・2が2回 ・3が1回 「Array b」が1以外の時の「Array a」   [0] => 1   [2] => 2   [7] => 2   [8] => 3 ・2が2回 ・1が1回 ・3が1回

    • ベストアンサー
    • PHP
  • 小数の割り算と概数に関しての質問です。

    小数の割り算と概数に関しての質問です。 実際に割り算する前の数字のまるめ方がよくわかりません。 たとえば算数、数学の問題で、世界の人口に対する日本の人口の割合を百分率で求めるときに、上から2ケタの概数で求める場合には、9ケタ÷10ケタを計算する前に割る数と割られる数を四捨五入して、上から2ケタの概数にしてから計算しますよね。 しかし、小数第一位を四捨五入して整数で答えなさいと出題された場合にはそのまま割り算をする必要があるのでしょうか。 あるいは上から何ケタ目かを四捨五入してから計算すべきなのでしょうか。 上記の問題を言い換えてみます。 m桁の自然数Aとn桁の自然数Bがある。 A÷Bの小数第三位を四捨五入してできた数をCとする。 Aの上からp桁目を四捨五入した数をA’、Bの上からp桁目をB’とする。 A’÷B’の小数第三位を四捨五入してできた数をC’とする。 CとC’が等しいとき、pの最小値を調べよ、またはm、nを用いて表せ。 CとC’が完全に等しい必要は本当はないのかもしれません。 慣用としてこのような計算をする場合には誤差が入ってもよいとされているのかもしれません。 答えがあるかどうかも分かりませんが、上の例題の場合ではなく、一般的な答えが知りたいです。

  • 配列の要素追加について

    配列Aがあり、その配列に別の要素を加えた配列Bを作成するためにはどのようにすればよいのでしょうか? Aをコピーしたものに要素を一つ加えてと考えたのですが。。。 つまり char[] a = {'a', 'b', 'c'}; char ch = 'd'; とあったときに、aにchを加えて char[] b = {'a', 'b', 'c', 'd'}; を作成したいです。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • ハッシュの中に格納された配列の要素数を得る方法

    予想配列のあるキーを配列とします。 %hash; @hash{'a'}=['aa','ab','ac']; 一方で普通の配列をスカラ変数として扱うと配列数を表します。 @array=(a,b,c,d,e); $num=@array; # $numは5になる。 それでは $num=@hash{'a}; あるいは  $num=@{hash{'a'}}; としたらどうなるのって ARRAY(0x2438c4) みたいになって、$numに@hash{'a'}の要素数は入りません。 予想配列の中に格納された配列の要素数を取り出す簡便な方法はないものでしょうか。 お手数をお掛けします。

    • ベストアンサー
    • Perl
  • Java:クラスのインスタンスを配列の要素にする?

    問題集で次のプログラムを見掛ました。 A[] array = {new B(), new C()}; クラスA型の配列変数arrayにクラスBとクラスCのインスタンスを要素として代入しています。 このような配列を作成した場合、具体的にどのような使い方があるのでしょうか? 簡単なプログラムを書いて頂けると嬉しいです。 よろしくお願いします。

  • 配列内の要素を元にソート

    配列内の要素を元に配列をソートしたいと考えております。 例) [0] => a,b,5 [1] => a,c,1 [2] => a,d,2 といった配列がある場合に [0] => a,c,1 [1] => a,d,2 [2] => a,b,5 と言った具合にソートは出来るのでしょうか? どなたかご存知の方、ご教授ください。 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 配列についてです(PHP)

    $a=array(1,2,3); とある場合、この 1,2,3は「要素」と呼ばれるのでしょうか? 「値」とは呼ばれないのでしょうか? $a=array("a"=>1,"b"=>2,"c"=>3); の場合、a,b,c は「添え字」もしくは「キー」になって 1,2,3は「値」となると思いますが、「要素」とは呼ばれないのでしょうか? $a["a"] ←これを「要素」と呼ぶのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 配列のソートと削除

    String型のstrToRemoveで与えられた文字列を配列から探し、あればそれ以降の配列の数字をすべて左にシフトします。 なので配列の大きさは1小さくなります。その結果の配列をreturnで返します。 例) ({"A","B","C","D","B"}, "B")配列1にBがあるのでそれ以降の文字列をすべて左にシフト→ {"A","C","D","B"} ({"A","B","C","D","B"}, "A") 配列0にAがあるのでそれ以降の文字列を左にシフト→ {"B","C","D","B"} プログラムは以下のように組みました。 public class ArrayFun { public String[] oneRemoved(String[] array, String strToRemove) { int count = 0; for (int i = 0; i < array.length; i++) {      if (strToRemove.equals(array[i]) && count == 0) {        for (int j = i; j < array.length - 1; j++) {          array[j] = array[j + 1];        }          count++;      } }      array = new String[array.length - 1];      array[array.length - 1] = null;      return array; } } ちなみにcountは、一度シフトすればもう同じ文字列がそれ以降の配列にあってもシフトはしないので、countでシフトしたかどうかを判断しようと思い付けました。 これでテストメソッドも作るのですが、 import static org.junit.Assert.*; import org.junit.Test; public class ArrayFunTest { @Test public void testoneRemoved() { ArrayFun af = new ArrayFun(); String[] a1 = {"A","B","C","D","B" };//元の配列 String[] a2 = {"A","BB","CCC","DDD","B"};//元の配列 String[] a3 = {"B","C","D","B"};//シフト後の配列 String[] a4 = {"A","BB","CCC","DDD","B"};//シフト後の配列 assertEquals(a3, af.oneRemoved(a1, "A")); assertEquals(a4, af.oneRemoved(a2, "NotHere")); } } 以上のように組むと、assertEqualsの真ん中に黒線が入って自動的に@SuppressWarnings("deprecation")が加えられてしまいます。 実行結果は、({"A","B","C","D","B"}, "A") の例だと、配列0にB が入るはずがnullになっている、とエラーがでます。 どのようにしたら正常に動かせるでしょうか?宜しくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう