如何在PHP中找到多维数组重复?

时间:2014-11-19 18:16:37

标签: php arrays multidimensional-array duplicates

我有这个多维数组

[
    ['name' => 'test1', 'number' => '9999'],
    ['name' => 'test2', 'number' => '9999'],
    ['name' => 'test3', 'number' => '5555'],
    ['name' => 'test4', 'number' => '6666'],
    ['name' => 'test5', 'number' => '6666'],
    ['name' => 'test6', 'number' => '6666'],
]

我的计划是将它指向指出重复项的位置,除了第一个实例

[
    ['name' => 'test1', 'number' => '9999'],
    ['name' => 'test2', 'number' => '9999', 'duplicate' => 'yes'],
    ['name' => 'test3', 'number' => '5555'],
    ['name' => 'test4', 'number' => '6666'],
    ['name' => 'test5', 'number' => '6666', 'duplicate' => 'yes'],
    ['name' => 'test6', 'number' => '6666', 'duplicate' => 'yes'],
]

请注意,第一个副本被排除,只有任何其他副本被标记为重复

如果它有帮助,我有一个单独的数组,我运行array_count_values,并获得

array (size=3)
  9999 => int 2
  5555 => int 1
  6666 => int 3

所以我知道每个数字有多少重复

foreach初始数组我可以测试数字是否与array_count_values数组中的数字相匹配,并查看计数> 1然后将它们标记为重复,但我不知道如何排除第一个重复实例

任何想法?

my test code, run it here

$array = [
    ['name' => 'test1', 'number' => '9999'],
    ['name' => 'test2', 'number' => '9999'],
    ['name' => 'test3', 'number' => '5555'],
    ['name' => 'test4', 'number' => '6666'],
    ['name' => 'test5', 'number' => '6666'],
    ['name' => 'test6', 'number' => '6666'],
];

$second = [
    '9999' => 2,
    '5555' => 1,
    '6666' => 3,
];

foreach($array as $k => $data) {
    foreach($second as $num => $key) {
    if($key > 1) {
        if($data['number'] == $num) {
        $array[$k]['duplicate'] = 'yes';
        }
    }
    }
}

var_dump($array);

3 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是将您自己的索引保存在另一个数组中。如果将每个数字存储为新数组中的键,则可以在每次在阵列中看到该键时增加该键。这应该是解决这个问题的一种相当快速的方法。

<?php
$array = [
  ['name' => 'test1', 'number' => '9999'],
  ['name' => 'test2', 'number' => '9999'],
  ['name' => 'test3', 'number' => '5555'],
  ['name' => 'test4', 'number' => '6666'],
  ['name' => 'test5', 'number' => '6666'],
  ['name' => 'test6', 'number' => '6666'],
];

$counterArray = array();
for($i = 0; $i < count($array); $i++) {
  $val = $array[$i]['number'];
  if(!array_key_exists($val, $counterArray)) {
    $counterArray[$val] = 0;
  } else {
    $counterArray[$val]++;
  }
}

print_r($counterArray);
?>

这是未经测试的代码,只是为了让您了解如何处理此问题。

答案 1 :(得分:1)

未经测试,但......

$total = count($array);
$dupecount = array();
for($i = 0; $i < ($total - 1); $i++) {
   if ($array[$i]['status'] == 'duplicate') {
       continue; // this entry was already processed, so skip it.
   }
   for($j = $i + 1; $j < $total; $j++) {
      if ($array[$i] == $array[$j]) {
         $array[$j]['status'] = 'duplicate'; // update states
         $dupecount[$array[$i]['number']]++; // add to stats
      }
   }
}

基本上,外部循环处理除数组的最后一个条目之外的所有条目。在处理过程中,它会检查当前条目是否已标记为重复。这样可以防止重复计算。

内部循环处理外部循环所在的所有内容。任何欺骗都被标记并计入。

答案 2 :(得分:0)

测试这个

   $array = array(

    array('name' => 'test1', 'number' => '9999'),
    array('name' => 'test2', 'number' => '9999'),
    array('name' => 'test3', 'number' => '5555'),
    array('name' => 'test4', 'number' => '6666'),
    array('name' => 'test5', 'number' => '6666'),
    array('name' => 'test6', 'number' => '6666'));


$second = array(
    '9999' => 2,
    '5555' => 1,
    '6666' => 3,
);

foreach($array as $k => $data) {
    if($second[$data["number"]] > 1) {
        $array[$k]["duplicate"] = "yes";
        $second[$data["number"]]--;
    }
}
var_dump($array);