2011-12-23 10 views
2

私はデータを失わないように再帰的にマージしようとしている次の2つの配列を持っています。Array_merge_recursiveは私に繰り返しデータを与え、それを削除する方法を提供します

$a = array(
    'group1' => array('names'=>array('g1name1', 'g1name2')), 
    'group2' => array('names'=>array('g2name1')) 
); 

$b = array(
    'group1' => array('names'=>array('g1name1', 'g1name3'), 'extras'=>array('g1extra1')), 
    'group3' => array('names'=>array('g3name1')) 
); 

私は、彼らが$a$bのいずれかに存在しているためgroup2group3のために正常に動作されarray_merge_recursive($a, $b);を使用していますが、それは$ aと$ bの両方でいくつかの重複データを持っているのでgroup1は私に問題を与えています。これは私が再帰的にマージした後のものです。名前にg1nameが2回、$ aから1回、$ bから1回ずつリストされていることに注目してください。

'group1' => 
    array 
     'names' => 
     array 
      0 => string 'g1name1' 
      1 => string 'g1name2' 
      2 => string 'g1name1' 
      3 => string 'g1name3' 
     'extras' => 
     array 
      0 => string 'g1extra1' 
      1 => string 'g1extra2' 
    'group2' => .... 
    'group3' => .... 

(リピート問題を修正し、完全にグループ2とグループ3を削除しません)私はこのarray_unique(array_merge_recursive($a, $b))ようarray_uniqueをしようとしたが、それは私に奇妙な結果を与えています。

+0

innerstレイヤー内にarray_uniqueが必要です。そのためにはループを使用する必要があります。 –

答えて

3

あなたのために働く必要があり、次

array_walk($arr, function(&$data, $key) { 
    foreach ($data as &$arr) { 
     $arr = array_values(array_unique($arr)); 
    } 
}); 

結果:

Array 
(
    [group1] => Array 
     (
      [names] => Array 
       (
        [0] => g1name1 
        [1] => g1name2 
        [2] => g1name3 
       ) 
      [extras] => Array 
       (
        [0] => g1extra1 
       ) 
     ) 
    [group2] => Array 
     (
      [names] => Array 
       (
        [0] => g2name1 
       ) 
     ) 
    [group3] => Array 
     (
      [names] => Array 
       (
        [0] => g3name1 
       ) 
     ) 
) 
+0

おかげでTim、それは働いた:) – sameold

0

悲しいことに、array_replace_recursive (PHP 5.3.0)­Docsは機能しません(Demo)。

幸いにもティム・クーパーはそれを指摘し、いくつかの提案をしました。私は私の新しい提案と非常に創造的ではなかったので、それは非常に彼の解決策の影響を受けています:

$result = array_merge_recursive($a, $b); 

array_walk($result, function(&$v) { 
    $v = array_map('array_unique', $v); 
}); 

New Demo

+1

'g1name2'が消去されても動作しません。 –

+0

これが上書きされます。簡単に真実に;)他の何かを探します。 – hakre

+0

@hakre、あなたのハイパーリンクをマークアップするためにブックマークレットまたはブラウザアドオンを使用しますか? – goat

1

array_merge_recursiveの代わりにarray_replace_recursiveを使用

関連する問題