Проблема с зацикливанием и объединением массивов в PHP - PullRequest
1 голос
/ 22 августа 2011

У меня есть два 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 ]

2 голосов
/ 22 августа 2011

Я не знаю, это плохой тон, но я решил свою проблему сам.:)

$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 голос
/ 22 августа 2011

Один из способов добиться этого - сначала переиндексировать массивы таким образом, чтобы он выглядел следующим образом:

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 () их без проблем.

Надеюсь, это поможет вам.

0 голосов
/ 22 августа 2011
$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;
    }
}
0 голосов
/ 22 августа 2011

это должно работать:

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