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

时间:2011-08-22 06:41:47

标签: php arrays loops merge foreach

我有两个2D数组。它们都包含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数组而没有重复。

感谢您的建议!

4 个答案:

答案 0 :(得分:2)

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

$i = 0;
foreach ($posts as $post) {

    $posts[$i] = $post;

    foreach ($rated_items as $item) {

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

            $posts[$i] += $item;

        }

    }

    ++$i;

}

修改

更好的方式......

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

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

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

    }

}

答案 1 :(得分:1)

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

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”值。 然后你可以没有问题地使用array_merge()它们。

我希望它可以帮到你。

答案 2 :(得分:0)

这应该有效:

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

答案 3 :(得分:0)

$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;
    }
}