2017-10-09 62 views
0

我想通过下面的类别中的数组键来过滤掉多维数组中的重复项。通过关键元素过滤掉数组重复项

我不得不阵列

// $selectedOffers 
    Array 
    (
     [Category1] => Array 
     (
      [2424] => Array 
      (
       [node_name] => Name2424 
      ) 
      [2525] => Array 
      (
       [node_name] => Name2525 
      ) 
     ) 
     [Category2] => Array 
     (
      [2121] => Array 
      (
       [node_name] => Name2121 
      ) 
      [2222] => Array 
      (
       [node_name] => Name2222 
      ) 
     ) 
    ) 

// $myProducts  
    Array 
    (
     [Category1] => Array 
     (
      [2323] => Array 
      (
       [node_name] => Name2323 
      ) 
      [2525] => Array 
      (
       [node_name] => Name2525 
      ) 
     ) 
    ) 

对于筛选出来我用array_diff_key($selectedOffers, $myProducts)。问题在于它按类别过滤而不是按元素过滤。因此,如果$ selectedOffers和$ myProducts数组具有相同的类别但数值不同,它将显示相同的类别。

我在想循环槽的类别和建立新的数组,但想知道是否有更简单的方法来做到这一点。

任何提示和帮助,将不胜感激!

在此先感谢!

回答

1
<?php 


$data = 
[ 
    [ 
     1 => [], 
     2 => [] 
    ], 
    [ 
     3 => [], 
     4 => [] 
    ] 
]; 

$mine = 
[ 
    [ 
     2 => [] 
    ], 
    [ 
     3 => [], 
     5 => [] 
    ] 
]; 


$ids = []; 
foreach($mine as $outer) 
    foreach($outer as $k => $v) 
     $ids[] = $k; 

$filter = function($k) use ($ids) { 
    return false === array_search($k, $ids); 
}; 

$filtered = array_map(function($v) use ($filter) { 
    return array_filter($v, $filter, ARRAY_FILTER_USE_KEY); 
}, $data); 

var_export($filtered); 

输出:

array (
0 => 
array (
    1 => 
    array (
    ), 
), 
1 => 
array (
    4 => 
    array (
    ), 
), 
) 

为PHP 5.5(看起来好像你可以跳过使用array_filter):

$ids  = array_flip($ids); 
$filtered = array_map(function($v) use ($ids) { 
    return array_diff_key($v, $ids); 
}, $data); 
+0

我知道我已经接受了答案,但有什么办法在php 5.5中这样做?顺便写下代码:) – Giedrius

+1

增加了array_filter的替代方法,请检查它是否按预期工作。 – Progrock

+0

谢谢,只是一个脱离主题的问题,我怎么学会写这么整洁的代码,因为这一个:)) – Giedrius