【问题标题】:PHP: Check for duplicate values in a multidimensional arrayPHP:检查多维数组中的重复值
【发布时间】:2011-06-24 08:27:12
【问题描述】:

我遇到了多维数组的问题。

给定以下多维数组:

Array(
[0] => Array("a", "b", "c")
[1] => Array("x", "y", "z")
[2] => Array("a", "b", "c")
[3] => Array("a", "b", "c")
[4] => Array("a", "x", "z")
)

我想检查它的值并找到重复项(即键 0、2 和 3),只留下一个键值对删除其他键值对,结果如下:

Array(
    [0] => Array("a", "b", "c")
    [1] => Array("x", "y", "z")
    [2] => Array("a", "x", "z")
    )

我该怎么做??

【问题讨论】:

标签: php arrays duplicates multidimensional-array


【解决方案1】:

你可以简单地使用 in_array() 来完成

$data = Array(
    0 => Array("a", "b", "c"),
    1 => Array("x", "y", "z"),
    2 => Array("a", "b", "c"),
    3 => Array("a", "b", "c"),
    4 => Array("a", "x", "z"),
);

$final = array();
foreach ($data as $array) {
    if(!in_array($array, $final)){
        $final[] = $array;
    }
}

这会让你得到类似的东西

array(3) {
  [0] => array(3) {
    [0] => string(1) "a"
    [1] => string(1) "b"
    [2] => string(1) "c"
  }
  [1] => array(3) {
    [0] => string(1) "x"
    [1] => string(1) "y"
    [2] => string(1) "z"
  }
  [2] => array(3) {
    [0] => string(1) "a"
    [1] => string(1) "x"
    [2] => string(1) "z"
  }
}

【讨论】:

    【解决方案2】:

    这将使用array_unique()从您的数组中删除重复项:

    $new_arr = array_unique($arr, SORT_REGULAR);
    

    【讨论】:

    • -1 查看文档。这将在比较之前将数组的值转换为字符串。
    • @Artefacto:查看文档。我正在使用不使用字符串比较的SORT_REGULAR 标志。
    • 根据 php 文档“请注意,array_unique() 不适用于多维数组。”。可以从给定的链接中看到。
    • @enam 我认为这只是意味着array_unique 不会展平数组以找到唯一性。 (顺便说一句,+1)
    • Thought array_unique 不适用于多维数组。
    【解决方案3】:
    $arr = ...;
    $final = array();
    sort($arr);
    foreach ($arr as $el) {
       if (!isset($prev) || $el !== $prev)
           $final[] = $el
        $prev = $el;
    }
    

    这是一个更有效的1 解决方案(log n + n 而不是二次),但它依赖于数组的所有元素之间的总顺序,您可能没有(例如,如果内部数组有对象)。

    1 比使用in_array 更有效。原来array_unique居然用了这个算法,所以也有同样的缺点。

    【讨论】:

      【解决方案4】:

      您可以通过序列化来智能地比较数组。

      var_dump(makeUnique($data));
      
      function makeUnique(array $data)
      {
          $serialized = array_map(create_function('$a', 'return serialize($a);'), $data);
          $unique = array_unique($serialized);
          return array_intersect_key($unique, $data);
      }
      

      玩得开心

      【讨论】:

        【解决方案5】:

        要检查在多维数组上使用 array_unique,您需要像这样使用 implode 将其展平。

            $c=count($array)
            for($i=0;$i<$c;$i++)
            {
            $flattened=implode("~",$array[$i]);
            $newarray[$i]=$flattened;
             }
            if(count(array_unique($newarray)
            <count($newarray))
            {
            //returns true if $array contains duplicates
            //can also use array_unique on $newarray 
            //to remove   duplicates, then explode, 
            //to return to default state
            }
        

        希望这有帮助,花了一些时间才得到它。

        【讨论】:

        • 你能解决编码错误吗?
        【解决方案6】:
        **This is example array**
        $multi_com=[
            [
                {
                    "combination_id": "19"
                },
                {
                    "combination_id": "20"
                },
                {
                    "combination_id": "21"
                }
            ],
            [
                {
                    "combination_id": "18"
                },
                {
                    "combination_id": "20"
                },
                {
                    "combination_id": "22"
                }
            ],
            [
                {
                    "combination_id": "20"
                },
                {
                    "combination_id": "21"
                }
            ]
        ]
        
        **This is sample code**
                $array1 = [];
                $array2 = [];
                $status = false;
                foreach ($multi_com as $key => $val) {
                    foreach ($val as $key2 => $val2) {
                        if (count($array1) !== 0) {
                            $array_res = in_array($val2->combination_id, $array1);
                            if ($array_res) {
                                $array2[] = $val2->combination_id;
                            }
                        }
                    }
        
                    if (!$status) {
                        for ($x = 0; $x < count($val); $x++) {
                            $array1[] = $val[$x]->combination_id;
                        }
                    } else {
                        $array1 = [];
                        $array1 = $array2;
                        $array2 = [];
                    }
                    $status = true;
                }
        
                return $array1;
        

        【讨论】:

        • return $array1=[20]
        猜你喜欢
        • 2013-10-14
        • 2018-12-28
        • 2019-03-05
        • 2016-03-03
        • 1970-01-01
        • 2015-06-04
        • 2021-09-25
        • 2019-02-15
        • 1970-01-01
        相关资源
        最近更新 更多