найти дубликаты в массиве php - PullRequest
1 голос
/ 24 марта 2012

У меня есть двумерный массив в php, как это:

Array (
        [0] => Array
            (
                        [index1] => -1
                        [index2] => 77
                        [description] => 7
                    )
        [1] => Array
            (
                        [index1] => -1
                        [index2] => 77
                        [description] => 5
                    )
        [2] => Array
            (
                        [index1] => -1
                        [index2] => 78
                        [description] => 12
                    )
)

Мне нужно выяснить, есть ли дубликаты между массивами первого уровня. Но только с учетом ключей index1 и index2.

В приведенном выше примере он должен возвращать true, потому что 0 и 1 имеют одинаковые index1 и index2.

Ответы [ 5 ]

2 голосов
/ 24 марта 2012

Попробуйте это:

<?php

$a=array(
    array('index1'=>-1,'index2'=>77,'description'=>7),
    array('index1'=>-1,'index2'=>77,'description'=>5),
    array('index1'=>-1,'index2'=>78,'description'=>12)
);


function check($a){
    $data=array();

    foreach($a as $arr){
        if ($data[$arr['index1'].'|'.$arr['index2']]) {
            return true;
        }
        $data[$arr['index1'].'|'.$arr['index2']]=true;
    }
    return false;
}

if (check($a)) {
    echo "duplicates found";
}else{
    echo "no duplicates";
}

?>
1 голос
/ 24 марта 2012
function hasDupes($array, $delim = '|') {
    $values = array();
    foreach ($array as $v) {
        $v = $v['index1'] . $delim . $v['index2'];
        if (isset($values[$v])) {
            return true;
        }
        $values[$v] = 0;
    }
    return false;
}

Нет необходимости во вложенных циклах или полных обходах (или даже многократных обходах) по массиву, что, кстати, является тем, что большинство предлагаемых функций array_something выполняют внутренне.Выполните итерацию один раз и остановитесь, когда увидите элемент, который вы видели раньше.

0 голосов
/ 24 марта 2012

Не очень эффективный алгоритм, но метод грубой силы, предполагающий числовую индексацию внешнего массива:

function hasDuplicates($array) {
  $count = count($array);
  for ($i = 0; $i < $count; $i++){
    for ($j = $i+1; $j < $count; j++) { // check every later element in the array
      if ($array[i]['index1'] == $array[j]['index1'] && $array[i]['index2'] == $array[j]['index2']) {
        return true;
      }
    }
  }
  return false;
}
0 голосов
/ 24 марта 2012
  1. Сортировка массива с помощью пользовательской функции сортировки, такой как http://de3.php.net/manual/de/function.uasort.php
  2. . Пройдите по отсортированному массиву и сравните попарно, если они идентичны, верните true, в противном случае false
0 голосов
/ 24 марта 2012

Два метода, которые могут вам помочь:
1. если вы просто хотите удалить дубликаты, вы можете использовать:
http://php.net/manual/en/function.array-unique.php
2. если вы хотите найти дупс, вы можете отсканировать массив и «для каждого» элемента - проверить оставшуюся часть массива, используя:
http://php.net/manual/en/function.array-search.php

...