配列(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
)
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);
?>
この回答への補足
回答ありがとうございました。
おかげで望む結果を得ることができました。
出来たのですが、コード内容で分からないことがあるので、教えてください。
>配列のkeyの一致するところだけ
というのは、「if (array_key_exists($key, $input1)) {」を指すのでしょうか?
array_key_exists関数は指定キー/添字が存在しているかどうか確認するもので、
存在していても必ずしも一致しているとは限らないとも思うのですが、
どうしてこれで、望む結果が得られているのでしょうか?
foreachの中で利用しているので、存在さえしていれば、総当りで処理するので、必ず一致するところとぶち当たるということなのでしょうか?
回答ありがとうございました。
>関数と配列2つを引数に取る関数を作り
こういう書き方も出来るんだな、と初めて知りました。
また、「ファーストクラス」という考え方と言うか、言葉自体初めて聞いたので検索してみたのですが、興味深く感じ、大変勉強になりましたー
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の要素にあるかチェックされます。
大変詳しい説明ありがとうございました
>存在しているか調べているので、input0にあるキーがinput1にもある場合のみarray_key_existsがtrue
>input1にあるキーがinput0にない場合、foreachではそのキーは出現しませんので、
>それを使ってarray_key_existsを呼び出す事自体が起こりえません
よく分かりました。おかげでスッキリしました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- その他(プログラミング・Web制作) listへのappendが出来ない件 1 2022/12/06 21:44
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Delphi XEの警告文を消したい
-
foreachの間にテーブルの<TR>を...
-
foreachで上限回数指定方法また...
-
STLのvectorで作った配列をメン...
-
読み(あ行~わ行)ごとに分け...
-
foreachのなかで次のキーを参照...
-
String だと「 ByRef引数の型が...
-
エラーメッセージ(無効な間接...
-
PHPでCSVの一部の行を編集したい
-
$_SESSIONに二次元配列を使える...
-
PHPのカッコ[ ]の使い方について
-
OCI で、SELECT結果行数を取得...
-
rubyで複数列のデータを一行に...
-
CSVデータの行数カウントをした...
-
行列
-
配列の要素(value)に、変数を...
-
別ファイルの構造体の値を読み...
-
ヒアドキュメントの中のfor文
-
複数行のデータのPOST処理に関して
-
ログファイルが一定行数を超え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
重複確認
-
foreachで上限回数指定方法また...
-
マッチング処理(1:N)
-
Excel VBAでフィルター後の対象...
-
VB.NET で 二次元のハッシュは...
-
多次元配列を、1次元の配列にす...
-
SELECT 使用時の bindValue の...
-
Smartyでインクリメント
-
PHPでこのコード自体に意味は無...
-
PHP、{}記号の意味
-
配列を比較して同じものがあっ...
-
phpでforeachの中にforeachがあ...
-
多次元配列の中で条件に合う要...
-
sqlのデーターを『あ行』『か行...
-
ラジオボタンをランダムに表示...
-
キーが倍数の時の値の存在チェ...
-
三重県南部の温泉
-
foreachで配列を、左から縦3列...
-
ジャグ配列
-
構造体の中でユーザー定義型の...
おすすめ情報