如何检查多维数组中是否存在某些索引的重复值?

时间:2017-01-25 08:09:47

标签: php arrays multidimensional-array

我的问题是我有从表单到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'));

但是它用于复制多行中的单列值,在我的情况下,如果相同行的多列与任何其他行的多列相同然后记录将被视为重复。

任何帮助都应该受到赞赏,提前致谢。

4 个答案:

答案 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)

这是一种设计非常快速的方法,可以找到重复的方法。请注意,重复项是对同一个键具有相同值的元素。因此,如果uidnametype中的任何一个匹配,则会将它们视为重复项。因此,我调整第三个数组元素,因为数组中的所有元素共享相同的值。

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

再次感谢那些回答的人。