【问题标题】:PHP: How to check if duplicate values in array and keep record of them?PHP:如何检查数组中的重复值并记录它们?
【发布时间】:2018-03-27 23:17:58
【问题描述】:

我有一个多维数组,它输出数据(这被一个 foreach 循环填充特定项目):

Array
(
[1] => Array
    (
        [0] => 0
    )

[3] => Array
    (
        [0] => 0
        [1] => 1
        [2] => 2
    )

[9] => Array
    (
        [0] => 2
    )
)

第一个键是特定项目的 id,第二级的键没有意义/重要性,但是值是。

正如您在此示例中所见,13 中都存在值 02 值同时存在于 39 中,并且只有 1 是唯一的.我想在这里实现的是检查多个项目中是否存在任何值(就像这里的情况一样),并有一些方法可以跟踪某些值的重复位置。

我该怎么做呢?我已经尝试实施多种解决方案,包括找到 here 的解决方案,但无论我尝试什么,它似乎都不像我想要的那样工作。

非常感谢任何可以帮助我或为我指明正确方向的人。

【问题讨论】:

  • ...有一些方法可以跟踪某些值的重复位置... 如果 count(array_unique(array))
  • 你想用什么方式来跟踪这个?

标签: php arrays multidimensional-array duplicates


【解决方案1】:

你可以这样做来检测你是否有重复

$mergedValues = [];
foreach ($outerArray as $id => $innerArray) {
  $mergedValues = array_merge($mergedValues, $innerArray);
}
$uniqueValues = array_unique($mergedValues);
if (sizeof($uniqueValues) != sizeof($mergedValues)) {
  echo 'You have duplicates!', PHP_EOL;
  echo 'These are duplicates: ', implode(', ', array_unique(array_diff_assoc($mergedValues, $uniqueValues))), PHP_EOL;
}

【讨论】:

    【解决方案2】:

    我喜欢 Aron Cederholm 的回答,但您可以选择的另一个可能为您提供大量信息的选项是创建一种反向关联数组,其中值成为键,反之亦然。这就是我的意思(基于 Aron 的初始循环):

    $valueMap = [];
    foreach ($outerArray as $id => $innerArray) {
        foreach ($innerArray as $value) {
            if (!isset($valueMap[$value])) $valueMap[$value] = [$id];
            else $valueMap[$value][] = $id;
        }
    }
    

    这有利于为您提供按值索引的数组,并且对于每个值,如果有意义的话,您可以查看原始数组的哪些索引包含该值。然后,您可以检查有多少项目包含您要查找的值

    count($valueMap[$value])
    

    $valueMap[$value] 处的项目为您提供了一个可以找到这些值的索引数组,这解决了您的“跟踪值”问题,对吧?

    缺点是您现在使用的内存量增加了一倍。

    【讨论】:

      【解决方案3】:

      您要查找的实际上是 array_intersect 并将数组值作为参数传递。

      从 5.6 开始使用 php,您可以使用 variadic functions 传递数组。

      array_intersect(...array_values($array));
      

      这将显示在整个数组中重复的值。

      最后在单个元素上获得唯一的重复值:

      $repeated = [];
      foreach (array_values($array) as $analyzed_part) {
        array_map(function ($array_piece) use ($analyzed_part, &$repeated) {
          // Skip the current
          if ($analyzed_part != $array_piece) {
            $repeated[] = array_intersect($analyzed_part, $array_piece);
          }
        }, $array);
      }
      
      // Here you have all the repetitions between one element and the other
      var_dump($repeated);
      
      // Get the unique values
      $unique_repeated = array_unique(array_merge(...$repeated));
      var_dump($unique_repeated);
      

      【讨论】:

      • 您到eval.in 的链接错误存在服务器错误。
      • 感谢@JuanAntonio 指出,eval.in 大约一年前关闭。我将暂时删除链接,如果您知道任何好的替代方法,请告诉我
      猜你喜欢
      • 2021-01-10
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      相关资源
      最近更新 更多