我的问题是我有从表单到php的多维数组发布,现在我想检查一些索引的重复值是否存在于多维数组中? e.g:
$data=Array
(
0 => Array
(
uid => '100',
name => 'Sandra Shush',
type => 'abc'
),
1 => Array
(
uid => '101',
name => 'Sandra Shushtext',
type => 'xyz'
),
2 => Array
(
uid => '100',
name => 'Sandra Shush',
type => 'abc'
)
);
这里索引1和2的名称和类型是相同的,那我该怎么检查呢?
我熟悉
$key = array_search('abc', array_column($data, 'type'));
但是它用于复制多行中的单列值,在我的情况下,如果相同行的多列与任何其他行的多列相同然后记录将被视为重复。
任何帮助都应该受到赞赏,提前致谢。
答案 0 :(得分:1)
您可以尝试使用array_reduce
使用所需的项目键创建密钥:
$result = array_reduce($data, function ($carry, $item) {
$key = $item['uid'] . $item['type'];
$item['is_duplicate'] = isset($carry[$key]);
if ($item['is_duplicate']) {
$carry[] = $item;
} else {
$carry[$key] = $item;
}
return $carry;
}, []);
var_dump($result);
答案 1 :(得分:1)
最简单的方法,至少我会使用的是将数组编码为md5(或任何其他类型)字符串并比较这些值。
我认为这是最有效的。
示例:
<?php
function arrayToString($array) {
$str = '';
if ( !is_array($array) )
return $str;
foreach ( $array as $key => $val ) {
$str .= $key . ':' . $val;
}
return $str;
}
$data=Array
(
0 => Array
(
'uid' => '100',
'name' => 'Sandra Shush',
'type' => 'abc'
),
1 => Array
(
'uid' => '100',
'name' => 'Sandra Shush',
'type' => 'xyz'
),
2 => Array
(
'uid' => '100',
'name' => 'Sandra Shush',
'type' => 'abc'
)
);
$temp = array();
foreach ( $data as $d ) {
array_push($temp, md5(arrayToString($d)));
}
$unique = array_unique($temp);
var_dump($unique); // prints unique array
答案 2 :(得分:1)
这是一种设计非常快速的方法,可以找到重复的方法。请注意,重复项是对同一个键具有相同值的元素。因此,如果uid
,name
或type
中的任何一个匹配,则会将它们视为重复项。因此,我调整第三个数组元素,因为数组中的所有元素共享相同的值。
$data = [
....
2 =>
[
'uid' => '200',
'name' => 'Mandra Shush',
'type' => 'abcx'
]
];
$duplicates = [];
$valuesToCompare = ["uid", "name", "type"];
function equals($value, $toCompare, $keysToCompare)
{
foreach ($keysToCompare as $compareKey) {
if ($value[$compareKey] === $toCompare[$compareKey]) {
return true;
}
}
return false;
}
foreach ($data as $index => $element) {
foreach ($data as $indexInner => $elementToCompare) {
if ($index !== $indexInner) {
if (equals($element, $elementToCompare, $valuesToCompare)) {
$duplicates[] = [$index => $indexInner];
}
}
}
}
var_dump($duplicates);
这将输出以下内容,表示我们发现了2个重复项。其中元素0是1的重复,1是0的重复。
array (size=2)
0 =>
array (size=1)
0 => int 1
1 =>
array (size=1)
1 => int 0
答案 3 :(得分:0)
我实现了以上这样的场景:
不知道哪个是我最好的或其他人发布了答案。
foreach($data as $key => $row)
{
$combinedarr[] = array("name"=>$row["name"],"type"=>$row["type"]);
}
//chck if same facilitiy is being visit on same date twice
$countcomb = count($combinedarr);
$uniquearr = array_unique($combinedarr, SORT_REGULAR);
if($countcomb==count($uniquearr)){
}else{
//yes duplicate exists
};
再次感谢那些回答的人。