2010-08-27 2 views
3

Быстрый вопрос: существует ли способ обеспечить закрытие в PHP некоторой эквивалентной функции функции array_unique, чтобы вы могли указать свое собственное закрытие сравнения, которое будет использоваться, когда сравнивая два элемента в массиве? У меня есть массив экземпляров класса (который может содержать дубликаты) и хочу сказать PHP, чтобы использовать определенную логику для определения уникальности.PHP, обеспечивающий закрытие для определения уникальности элемента в массиве

PHP предоставляет эту сортировку с использованием метода usort() - просто интересно, доступно ли оно также для проверок уникальности. Благодаря!

ответ

1

есть array_filter, что вы можете применить функцию обратного вызова для каждого элемента массива и возвращает истину/ложь о том, чтобы сохранить это значение в возвращаемый массив. Here is a comment с использованием array_filter для удаления дубликатов в массиве.

0

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

$a = new StdClass; 
$b = new StdClass; 
$c = new StdClass; 
$d = new StdClass; 

$a->a = 1; 
$b->a = 1; 
$c->c = 1; 
$d->c = 1; 

$objects = array($a,$b,$c,$d); 

function custom_array_unique(array $objects) { 

    foreach($objects as $k =>$object) { 
     foreach($objects as $k2 => $object2) { 

      if ($k !== $k2 && $object == $object2) { 
       unset($objects[$k]); 
      } 

     } 
    } 
    return $objects; 
} 

print_r(custom_array_unique($objects)); 


Array 
(
    [1] => stdClass Object 
     (
      [a] => 1 
     ) 

    [3] => stdClass Object 
     (
      [c] => 1 
     ) 

) 
0

manual page для array_unique() не дает какой-либо ссылки на версию обратного вызова, и нет функции в списке ссылок слева, которая называется array_uunique() (это то, что должна вызывать такая функция, если она следует за соглашением именования других функций сортировки массива, но тогда PHP isn Очень надежна, когда речь идет о соглашениях об именовании функций).

Вы можете добавить эту функцию самостоятельно, используя двойной foreach цикл:

$uniqueness_fails = false; 
foreach ($myarray as $keyA => $valueA) { 
    foreach ($myarray as $keyB => $valueB) { 
     if ($keyA != $keyB and my_equality_function($valueA, $valueB)) { 
      $uniqueness_fails = true; 
      break 2; 
     } 
    } 
} 
Смежные вопросы