如何从多维数组中删除重复值

时间:2014-02-13 15:40:22

标签: php arrays multidimensional-array unique

我想从多暗阵列中删除重复值,我尝试了所有可能的解决方案已经描述但对我来说,不起作用,有人可以请更正吗? 这是我的数组:

Array ( 
  [0] => Array ( 
         [0] => element_10 
         [1] => block_1 
         [2] => element_4 
         [3] => element_1 
         [4] => element_3 
               ) 
[1] => Array ( 
        [0] => block_1 
        [1] => block_2 
        [2] => element_8 
        [3] => element_10 
        [4] => element_12 
        [5] => element_14 
        [6] => element_4 
        [7] => element_2 
        [8] => element_3 
        [9] => element_9 
        [10] => element_13 
        [11] => element_7 
          ) 
) 

我想要这种格式的数组:

Array ( 
  [0] => Array ( 
         [0] => element_10 
         [1] => block_1 
         [2] => element_4 
         [3] => element_1 
         [4] => element_3 
               ) 
[1] => Array ( 
        [1] => block_2 
        [2] => element_8 
        [4] => element_12 
        [5] => element_14 
        [7] => element_2 
        [9] => element_9 
        [10] => element_13 
        [11] => element_7 
          ) 
) 

我可以稍后设置密钥索引。

我试过了:

function multi_unique($array) {
    foreach ($array as $k=>$na)
        $new[$k] = serialize($na);
    $uniq = array_unique($new);
    foreach($uniq as $k=>$ser)
        $new1[$k] = unserialize($ser);
    return ($new1);
}

没有运气,然后我尝试了:

function array_unique_multidimensional($input)
{
    $serialized = array_map('serialize', $input);
    $unique = array_unique($serialized);
    return array_intersect_key($input, $unique);
}

返回相同的数组。

我也试过这个方法:

function super_unique($array)
{
  $result = array_map("unserialize", array_unique(array_map("serialize", $array)));

  foreach ($result as $key => $value)
  {
    if ( is_array($value) )
    {
      $result[$key] = self::super_unique($value);
    }
  }
  return $result;
}

请帮助我,我知道这很简单我不知道我在哪里输了?

谢谢,

3 个答案:

答案 0 :(得分:2)

您需要遍历输入数组列表。对于该数组中的每个值,您需要查看以前是否遇到过它,因此您必须在所有数组中保留所有值的超集,并逐渐附加到该数组。如果超集数组中已存在某个值,则可以将其删除,否则可以将其附加。

function multi_unique($arrays) {
  $all_values = array();

  foreach ($arrays as &$array) {
    foreach ($array as $index => $value) {
      if (in_array($value, $all_values)) {
        // We've seen this value previously
        unset($array[$index]);
      } else {
        // First time we've seen this value, let it pass but record it
        $all_values[] = $value;
      }
    }
  }
  return $arrays;
}


$values = array (
  array ( 'element_10', 'block_1', 'element_4', 'element_1', 'element_3',) ,
  array ( 'block_1', 'block_2', 'element_8', 'element_10', 'element_12', 'element_14', 'element_4', 'element_2', 'element_3', 'element_9', 'element_13', 'element_7',)
);

var_dump(multi_unique($values));

输出:

array(2) {
  [0]=>
  array(5) {
    [0]=>
    string(10) "element_10"
    [1]=>
    string(7) "block_1"
    [2]=>
    string(9) "element_4"
    [3]=>
    string(9) "element_1"
    [4]=>
    string(9) "element_3"
  }
  [1]=>
  array(8) {
    [1]=>
    string(7) "block_2"
    [2]=>
    string(9) "element_8"
    [4]=>
    string(10) "element_12"
    [5]=>
    string(10) "element_14"
    [7]=>
    string(9) "element_2"
    [9]=>
    string(9) "element_9"
    [10]=>
    string(10) "element_13"
    [11]=>
    string(9) "element_7"
  }
}

答案 1 :(得分:1)

如果您只想从数组的第二个条目中删除重复项,请使用array_diff()

$array[1] = array_diff($array[1], $array[0]);

如果要将其应用于任意长度,请进行迭代。

答案 2 :(得分:0)

为什么使用serialize功能。

请改用array_diff。

简单就是。

$orginal = array(array(values), array(values), ...);

$copy = $original;

foreach($original as $k => $subArray) {
    $tmpCopy = $copy;
    unset($tmpCopy[$k]);
    unshift($tmpCopy, $subArray);
    $tmpCopy = array_values($tmpCopy);
    $original[$k] = call_user_func_array('array_diff', $tmpCopy);
}

这适用于二维数组

希望它有所帮助。