Как найти дубликаты многомерного массива в PHP?

у меня есть этот многомерный массив

[
['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 затем пометить их как дубликаты, но я не уверен, как исключить первый экземпляр dup

есть идеи?

мой тестовый код, запустите его здесь

$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);

1

Решение

проверить это

   $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);
0

Другие решения

Не проверено, но …

$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
}
}
}

По сути, внешний цикл обрабатывает все, кроме последней записи массива. Во время обработки он проверяет, была ли текущая запись уже помечена как дубликат. Это предотвратит двойной счет.

Внутренний цикл обрабатывает все ПОСЛЕ того, где находится внешний цикл. Любые дупы помечены и учтены.

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
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector