PHP中的循环和数组合并问题

PHP中的循环和数组合并问题,php,arrays,loops,merge,foreach,Php,Arrays,Loops,Merge,Foreach,我有两个二维数组。它们都包含id和其他不相关的东西。如果id匹配,我的工作就是将这两个数组合并在一起 这是他们的样子: array(3) { [0]=> array(3) { ["id"]=> string(3) "161" ["x"]=> string(1) "foo" ["y"]=> string(1) "bar" } } [1]=> array(3) { ["id"]=>

我有两个二维数组。它们都包含
id
和其他不相关的东西。如果
id
匹配,我的工作就是将这两个数组合并在一起

这是他们的样子:

array(3) {
  [0]=>
  array(3) {
    ["id"]=>
    string(3) "161"
    ["x"]=>
    string(1) "foo"
    ["y"]=>
    string(1) "bar"
    }
  }
  [1]=>
  array(3) {
    ["id"]=>
    string(3) "164"
    ["x"]=>
    string(1) "foo"
    ["y"]=>
    string(1) "bar"
    }
  [2]=>
  array(3) {
    ["id"]=>
    string(3) "168"
    ["x"]=>
    string(1) "foo"
    ["y"]=>
    string(1) "bar"
    }
}

array(2) {
  [0]=>
  array(3) {
    ["id"]=>
    string(3) "161"
    ["z"]=>
    string(1) "baz"
  }
  [1]=>
  array(3) {
    ["id"]=>
    string(3) "164"
    ["z"]=>
    string(1) "baz"
}
结果应该是这样的:

array(3) {
  [0]=>
  array(3) {
    ["id"]=>
    string(3) "161"
    ["x"]=>
    string(1) "foo"
    ["y"]=>
    string(1) "bar"
    ["z"]=>
    string(1) "baz"
    }
  }
  [1]=>
  array(3) {
    ["id"]=>
    string(3) "164"
    ["x"]=>
    string(1) "foo"
    ["y"]=>
    string(1) "bar"
    ["z"]=>
    string(1) "baz"
    }
  [2]=>
  array(3) {
    ["id"]=>
    string(3) "168"
    ["x"]=>
    string(1) "foo"
    ["y"]=>
    string(1) "bar"
    }
}
这就是我目前所拥有的。当然,它不起作用

foreach ($rated_items as $item) {

    foreach ($posts as $post) {

        if ($post['id'] == $item['id']) {

            $posts = array_merge($posts, $item); // Doesn't work at all.

        }

    }

}
问题是,我不知道如何将当前
$post
合并到当前
$item
中,然后,两个项目都添加到
$posts
数组中,而不会得到重复项


谢谢你的建议

实现这一点的一种方法是,首先以如下方式重新索引数组:

array(3) {
  [161]=>
  array(3) {
    ["id"]=>
    string(3) "161"
    ["x"]=>
    string(1) "foo"
    ["y"]=>
    string(1) "bar"
    }
  }
  [164]=>
  array(3) {
    ["id"]=>
    string(3) "164"
    ["x"]=>
    string(1) "foo"
    ["y"]=>
    string(1) "bar"
    }
  [168]=>
  array(3) {
    ["id"]=>
    string(3) "168"
    ["x"]=>
    string(1) "foo"
    ["y"]=>
    string(1) "bar"
    }
}
基本上,您会将“id”值设置为每个数组的键。 然后可以毫无问题地对它们进行数组_merge()


我希望这对你有帮助。

我不知道这是一个坏的语气,但我自己解决了我的问题。:)

编辑:

更好的方法

foreach ($posts as $key => $post) {

    if (isset($rated_items[$key])) {

        $posts[$key] += $rated_items[$key];

    }

}
这应该起作用:

$newArray = array();
foreach($array as $key => $arr){
    if(@$array2[$key]['id'] == $arr['id']){
        $newArray[] = array_merge($arr, $array2[$key]);
    } else {
        $newArray[] = $arr;
    }
}


您不需要使用$i,您可以改为使用:foreach($key=>&$post)。同样作为推荐使用参考(更有效),如:$posts[$i]=&$post;
$newArray = array();
foreach($array as $key => $arr){
    if(@$array2[$key]['id'] == $arr['id']){
        $newArray[] = array_merge($arr, $array2[$key]);
    } else {
        $newArray[] = $arr;
    }
}
$tmp = array_merge($posts , $rated_items);
$final = array();
foreach($tmp as $v){
    foreach($v as $k => $va){
        $final[$v['id']][$k] = $va; 
    }
}
$tmp = array_merge($posts , $rated_items);
$final = array();
foreach($tmp as $v){
    if($final[$v['id']]){
        $final[$v['id']] = array_merge($final[$v['id']], $v);
    }else{
        $final[$v['id']] = $v;
    }
}