>我有这个多维数组
[
['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
所以我知道每个数字有多少重复项
对于每个初始数组,我可以测试数字是否与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);
未测试,但...
$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
}
}
}
基本上,外部循环处理数组的最后一个条目之外的所有条目。在处理时,它会检查当前条目是否已标记为重复项。这将防止重复计算。
无论外循环在哪里,内循环都会处理所有内容。任何重复的重复都被标记和说明。
一种方法是将自己的索引保留在另一个数组中。如果将每个数字存储为新数组中的一个键,则可以在每次在数组中看到该键时递增该键。这应该是解决此问题的相当快速的方法。
<?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);
?>
这是未经测试的代码,只是为了让您了解如何解决这个问题。
测试这个
$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);