配列(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ランキング
-
多次元配列を、1次元の配列にす...
-
連想配列でキーを利用して一部...
-
配列からプルダウン用のHTMLを生成
-
元号の表示
-
PHPでこのコード自体に意味は無...
-
マッチング処理(1:N)
-
PHPで、'=>'の意味が分かりませ...
-
PHPで変数名にハイフンを使うに...
-
csvファイルの不定長フィールド...
-
正規表現について
-
添え字が全て文字列のPHPの多次...
-
SELECT 使用時の bindValue の...
-
思うような連想配列ができない・・
-
配列の値を集めた1つの文字列...
-
プルダウンメニューにDBの内容...
-
配列をループでたくさん宣言し...
-
ヒアドキュメントの中のfor文
-
file_existsでファイル名の部分...
-
[PHP] fputcsv()関数でファイル...
-
PHP 多次元配列変数のデータ受...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPでこのコード自体に意味は無...
-
マッチング処理(1:N)
-
foreachで上限回数指定方法また...
-
PHP、{}記号の意味
-
PHPで変数名にハイフンを使うに...
-
PHPで連想配列のプルダウンメニ...
-
VB.NET で 二次元のハッシュは...
-
多次元配列を、1次元の配列にす...
-
配列からプルダウン用のHTMLを生成
-
Smartyでインクリメント
-
phpでforeachの中にforeachがあ...
-
foreachとかの勝手な省略?
-
Excel VBAでフィルター後の対象...
-
foreachで配列を、左から縦3列...
-
$_POST受信で必要項目のみを結...
-
リストボックス複数選択抽出方法
-
POSTで渡されるデータの数がわ...
-
ftokが動かない?
-
foreachの間にテーブルの<TR>を...
-
3つの連想配列を交互に代入し...
おすすめ情報