プロが教えるわが家の防犯対策術!

質問させて頂きます。

言語:PHP

$aaa = array(array('id'=>1), array('id'=>2));
$bbb = array(array('id'=>1, 'name'=>'taro'), array('id'=>3, 'name'=>'hanako'));

上記の2つの配列でidキーが同じものは一緒にしたうえで、結合したいと考えています。
言葉足らずで申し訳ありません。実際に下に記述した形にしたいと考えています。
<結合後>
array(
'0' => array('id'=>1, 'name'=>'taro'),
'1' => array('id'=>2),
'2' => array('id'=>3, 'name'=>'hanako')
)

方法として、
foreachで$aaaを回し、さらにそのループの中でforeachで$bbbを回し、互いのidキーが同じならば、といった方法を考えたのですが、これではデータの数が多くなった際に、ループ数が大変なことになると思うので、何か別の方法は無いかと思い質問させて頂きました。

上記の方法よりスマートな方法があれば、教えて頂けると幸いです。
また、質問の内容に不備な点がありましたら、ご指摘お願いします。

よろしくお願いします。

質問者からの補足コメント

  • >再帰って知らない人?

    正直あまり深く理解出来ていません。
    もし何か良い方法があるなら教えて頂けると幸いです!

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/08/31 23:12

A 回答 (3件)

$aaa と $bbb を id でソートして、頭から同一 id 同士でマージしていけばいいんでないかい?


……と思って書いてみたら意外と長くなってしまったorz

----------------------------------------------------------------------------------------------

$aaa = array(array('id'=>1), array('id'=>2));
$bbb = array(array('id'=>1, 'name'=>'taro'), array('id'=>3, 'name'=>'hanako'));
$ccc = array();

$ia = 0;
$ib = 0;
$ic = 0;

function comp($lhs, $rhs) {
if ($lhs['id'] < $rhs['id']) return -1;
if ($lhs['id'] > $rhs['id']) return 1;
return 0;
}

usort($aaa, 'comp');
usort($bbb, 'comp');

while ($ia < count($aaa) || $ib < count($bbb)) {
if ($ia == count($aaa)) {
$ccc[$ic] = $bbb[$ib];
$ib++;
} else if ($ib == count($bbb)) {
$ccc[$ic] = $aaa[$ia];
$ia++;
} else {
switch (comp($aaa[$ia], $bbb[$ib])) {
case -1:
$ccc[$ic] = $aaa[$ia];
$ia++;
break;
case 1:
$ccc[$ic] = $bbb[$ib];
$ib++;
break;
case 0:
$ccc[$ic] = array_merge($aaa[$ia], $bbb[$ib]);
$ia++;
$ib++;
break;
default:
break;
}

$ic++;
}
}
    • good
    • 0

>ループ数が大変なことになると思うので、


再帰って知らない人?
この回答への補足あり
    • good
    • 0

なんかあったような気がしますが、プログラム的にやるとこんな感じ?


ただし全ての要素にidが存在し必ず数値であることが前提

<?PHP

$aaa = array(array('id'=>1, 'name'=>'taro'), array('id'=>2));
$bbb = array(array('id'=>1,'age'=>14), array('id'=>3, 'name'=>'hanako'));
$ccc = array();

foreach($aaa as $array){
$id=$array["id"];
$ccc[$id]=$array;
}

foreach($bbb as $array){
$id=$array["id"];
if(in_array($id,array_keys($ccc))){
$ccc[$id]=array_merge($ccc[$id],$array);
}else{
$ccc[$id]=$array;
}
}
$ccc=array_merge($ccc,array());
print_r($ccc);
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!