人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP5.2.6において
配列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を作成したのですが何かいい方法はありませんか?



●質問者: hopefully
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:いもの マッチ 作成 比較 配列
○ 状態 :終了
└ 回答数 : 5/7件

▽最新の回答へ

1 ● いのくに
●20ポイント

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
)
◎質問者からの返答

ありがとうございます。

やはり。foreachでまわして処理しかないんすかね?

なんか関数とかではさくっとはいきそうもないですかね?


2 ● pahoo
●20ポイント

こんな感じでいかがでしょうか。

<?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);
?>
◎質問者からの返答

ありがとうございます。


3 ● いのくに
●20ポイント

関数が無ければ作ればいいかと思います。

<?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
)
◎質問者からの返答

ありがとうございます。


4 ● pahoo
●20ポイント

やはり。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")); //一致する要素すべてに対して減算処理を行う

という修正をしたのですが

動きませんでした。

どうしたらいいのでそうか?


5 ● pahoo
●20ポイント

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];'
));
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ