配列A
Array
(
[11318] => 63705
[11549] => 20522
[12315] => 233151
[19999] => 51
)
配列B
Array
(
[11318] => 63700
[11549] => 20644
[12315] => 233100
[12316] => 999
)
上の2個の配列を比較して、引き算をしたいと思います。
マッチしたものは引いて
配列C
Array
(
[11318] => 5
[11549] => -122
[12315] => 51
)
などと格納して、マッチしないものはそのまま
配列D
Array
(
[19999] => 51
[12316] => 999
)
という風に、配列CとDを作成したのですが何かいい方法はありませんか?
PHPソース
<?php $a = array( "11318" => 63705, "11549" => 20522, "12315" => 233151, "19999" => 51 ); $b = array( "11318" => 63700, "11549" => 20644, "12315" => 233100, "12316" => 999, ); $c = array(); $d = array(); foreach($a AS $akey => $avalue){ if(!empty($b[$akey])){ $c[$akey] = $a[$akey] - $b[$akey]; }else{ $d[$akey] = $a[$akey]; } } foreach($b AS $bkey => $bvalue){ if(empty($a[$bkey])){ $d[$bkey] = $b[$bkey]; } } echo '$c = '.print_r($c, true); echo '$d = '.print_r($d, true); ?>
実行結果:
$c = Array ( [11318] => 5 [11549] => -122 [12315] => 51 ) $d = Array ( [19999] => 51 [12316] => 999 )
こんな感じでいかがでしょうか。
<?php $a = array(11318 => 63705, 11549 => 20522, 12315 => 233151, 19999 => 51); $b = array(11318 => 63700, 11549 => 20644, 12315 => 233100, 12316 => 999); $c = array(); $d = array(); //$aの要素のうち$bの要素に合致するものを検索し、見つかったら減算する foreach ($a as $key=>$val) { if (isset($b[$key])) { //合致 $c[$key] = $a[$key] - $b[$key]; } else { //合致せず $d[$key] = $a[$key]; } } //$bの要素のうち$aの要素に合致しないものを検索し、$dに代入する foreach ($b as $key=>$val) { if (! isset($a[$key])) { //合致せず $d[$key] = $b[$key]; } } //結果の確認 print_r($c); echo '<br />'; print_r($d); ?>
ありがとうございます。
関数が無ければ作ればいいかと思います。
<?php function myfunction($a, $b){ $c = array(); $d = array(); foreach($a AS $akey => $avalue){ if(!empty($b[$akey])){ $c[$akey] = $a[$akey] - $b[$akey]; }else{ $d[$akey] = $a[$akey]; } } foreach($b AS $bkey => $bvalue){ if(empty($a[$bkey])){ $d[$bkey] = $b[$bkey]; } } return array($c, $d); } $a = array( "11318" => 63705, "11549" => 20522, "12315" => 233151, "19999" => 51 ); $b = array( "11318" => 63700, "11549" => 20644, "12315" => 233100, "12316" => 999, ); list($c, $d) = myfunction($a, $b); echo '$c = '.print_r($c, true); echo '$d = '.print_r($d, true); ?>
実行結果
$c = Array ( [11318] => 5 [11549] => -122 [12315] => 51 ) $d = Array ( [19999] => 51 [12316] => 999 )
ありがとうございます。
やはり。foreachでまわして処理しかないんすかね?
なんか関数とかではさくっとはいきそうもないですかね?
foreach を使わない方法です(PHP5.0以上)――。
<?php //配列AからBを減ずるための関数 function mycomp(&$item, $key) { global $a, $b; $item = $a[$key] - $b[$key]; } //初期値 $a = array(11318 => 63705, 11549 => 20522, 12315 => 233151, 19999 => 51); $b = array(11318 => 63700, 11549 => 20644, 12315 => 233100, 12316 => 999); $c = array(); $d = array(); //配列 $a の中で $b に合致するものに対して減算処理する $c = array_intersect_key($a, $b); //一致する要素を$cに代入 array_walk($c, mycomp); //一致する要素すべてに対して減算処理を行う //互いに存在しない要素を $d に代入 $d = array_diff_key($a, $b) + array_diff_key($b, $a); //結果の確認 echo '$c = '; print_r($c); echo '<br />'; echo '$d = '; print_r($d); ?>
これはいいですねーー。
ありがとうございます。
ひとつだけ質問なのですが
PHPをCLASSで作成している際に
array_walk($c, array($this, "mycomp")); //一致する要素すべてに対して減算処理を行う
という修正をしたのですが
動きませんでした。
どうしたらいいのでそうか?
PHPをCLASSで作成している際に
array_walk($c, array($this, "mycomp")); //一致する要素すべてに対して減算処理を行うという修正をしたのですが動きませんでした。
どんなクラスを作られたのか分かりませんが、array_walkの第二引数はコールバック関数名でなければなりません。そこで、create_function関数を使う必要があります。
たとえば#4で紹介したユーザー関数 mycomp を埋め込むのであれば、下記のように書きます。
array_walk($c, create_function( '&$item, $key', 'global $a, $b; $item = $a[$key] - $b[$key];' ));
回答者 | 回答 | 受取 | ベストアンサー | 回答時間 | |
---|---|---|---|---|---|
1 | GoldenDawn | 426回 | 399回 | 81回 | 2009-02-03 12:48:52 |
2 | sakai | 9回 | 8回 | 2回 | 2009-02-03 13:30:26 |
ありがとうございます。
やはり。foreachでまわして処理しかないんすかね?
なんか関数とかではさくっとはいきそうもないですかね?