Подтвердить что ты не робот

Удалить дублированные элементы ассоциативного массива в PHP

$result = array(
    0=>array('a'=>1,'b'=>'Hello'),
    1=>array('a'=>1,'b'=>'other'),
    2=>array('a'=>1,'b'=>'other'),
);

Если он дублируется, удалите его, поэтому результат будет следующим:

$result = array(
    0=>array('a'=>1,'b'=>'Hello'),
    1=>array('a'=>1,'b'=>'other')   
);

Может ли кто-нибудь это знать?

Спасибо

4b9b3361

Ответ 1

Независимо от того, что предлагают другие пользователи, вы ищете функцию под названием array_unique Docs. Важно здесь установить второй параметр SORT_REGULAR, а затем задание легко:

array_unique($result, SORT_REGULAR);

Значение флага SORT_REGULAR:

сравнить элементы обычно (не менять типы)

И это то, что вы хотите. Вы хотите сравнить массивы Docs здесь и не изменять их тип в строку (которая была бы по умолчанию, если параметр не задан),

array_unique выполняет строгое сравнение (=== в PHP), для массивов это означает:

$a === $b TRUE, если $a и $b имеют одинаковые пары ключ/значение в том же порядке и тех же типах.

Выход (Демо-версия):

Array
(
    [0] => Array
        (
            [a] => 1
            [b] => Hello
        )

    [1] => Array
        (
            [a] => 1
            [b] => other
        )
)

Ответ 2

Во-первых, вы не можете использовать plain array_unique для этой проблемы, потому что array_unique внутренне обрабатывает элементы массива как строки, поэтому "Can not convert Array to String" появятся при использовании array_unique для этого.

Итак, попробуйте следующее:

$result = array(
    0=>array('a'=>1,'b'=>'Hello'),
    1=>array('a'=>1,'b'=>'other'),
    2=>array('a'=>1,'b'=>'other')
);

$unique = array_map("unserialize", array_unique(array_map("serialize", $result)));

print_r($unique);

Результат:

Array
(
    [0] => Array
        (
            [a] => 1
            [b] => Hello
        )

    [1] => Array
        (
            [a] => 1
            [b] => other
        )

)

Сериализация очень удобна для таких проблем.

Если вы чувствуете, что слишком много магии для вас, ознакомьтесь с этим сообщением

function array_multi_unique($multiArray){

  $uniqueArray = array();

  foreach($multiArray as $subArray){

    if(!in_array($subArray, $uniqueArray)){
      $uniqueArray[] = $subArray;
    }
  }
  return $uniqueArray;
}

$unique = array_multi_unique($result);

print_r($unique);

Как ни странно, in_array работает для массивов, где array_unique нет.