Как проверить, существуют ли повторяющиеся значения некоторых индексов в многомерном массиве или нет?

Моя проблема в том, что у меня есть многомерный массив, публикуемый из формы в php, теперь я хочу проверить, существуют ли повторяющиеся значения некоторых индексов в многомерном массиве или нет? например:

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

но это для дублирования значения одного столбца в нескольких строках, в моей ситуации, если несколько столбцов одних и тех же строк совпадают с несколькими столбцами любой другой строки, тогда запись будет считаться дубликатом.

Любая помощь должна быть оценена, спасибо заранее.


person Imran Qamer    schedule 25.01.2017    source источник


Ответы (3)


Вы можете попробовать использовать 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);
person Mihai Matei    schedule 25.01.2017

Это очень быстро разработанный подход, и он найдет дубликаты. Обратите внимание, что дубликаты — это элементы, которые имеют одинаковое значение для одного и того же ключа. Таким образом, если какие-либо из 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
person cb0    schedule 25.01.2017

Я достиг вышеприведенного сценария следующим образом:

Не знаю, какой из них лучше, мой или других, кто разместил ответы.

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

Еще раз спасибо тем, кто ответил.

person Imran Qamer    schedule 27.01.2017