Поиск уникальных данных в массивах с использованием php - PullRequest
0 голосов
/ 28 декабря 2011

У меня есть 2 массива, которые выглядят примерно так:

Array =>

[0] Array( [id]=434b5g6 [unique_id]=banana [level]=8)

[1] Array( [id]=bfrfnr [unique_id]=apple [level]=4)

[2] Array( [id]=yt347509 [unique_id]=grapefruit [level]=9 )

[3] Array( [id]=456645 [unique_id]=strawberry [level]=1)


Array =>

[0] Array( [id]=gon235g6 [unique_id]=strawberry [level]=8 )

[1] Array( [id]=bfrfnr [unique_id]=apple [level]=4 )

[2] Array( [id]=logujtng9 [unique_id]=grapefruit [level]=6 )

[3] Array( [id]=07yburhg [unique_id]=pinapple [level]=1)

Мне нужен способ удалить элементы, в которых [unique_id] существует в обоих массивах, чтобы у меня осталось 2 массива, которые содержат только элементы, которых нет в другом. Например, если бы мы запустили скрипт на этих 2 массивах, мне нужно было бы оставить:

Array =>
[0] Array( [id]=434b5g6 [unique_id]=banana [level]=8)

Array =>
[0] Array( [id]=07yburhg [unique_id]=pinapple [level]=1)

Хотя я действительно не уверен, как это сделать. Я знаю, что есть array_diff, но это работает только для одноуровневых массивов. Я использую многоуровневый первый и единственный trageting его [unique_id]. Любая помощь могла бы быть полезна.

Ответы [ 4 ]

1 голос
/ 28 декабря 2011

Попробуйте:


print_r(array_unique($arr1 + $arr2));

1 голос
/ 28 декабря 2011
  1. Получите уникальные идентификаторы из обоих массивов.
  2. Рассчитайте их разницу (элементы, которых нет в обоих).
  3. Отфильтруйте исходные массивы по элементам, которые находятся в diff.

Вот пример для PHP 5.3 +:

$uniqueIds1 = array_map(function ($item) { return $item['unique_id']; }, $array1);
$uniqueIds2 = array_map(function ($item) { return $item['unique_id']; }, $array2);

$reallyUniqueIds = array_merge(array_diff($uniqueIds1, $uniqueIds2), array_diff($uniqueIds2, $uniqueIds1));

$filteredArray1 = array_filter($array1, function ($item) use ($reallyUniqueIds) {
    return in_array($item['unique_id'], $reallyUniqueIds);
});
$filteredArray2 = array_filter($array2, function ($item) use ($reallyUniqueIds) {
    return in_array($item['unique_id'], $reallyUniqueIds);
});

Объяснение:

array_map(function ($item) { return $item['unique_id']; }, $array1)

Это просто извлекает все значения unique_id вмассив типа array('banana', 'apple', ...).

array_merge(array_diff($uniqueIds1, $uniqueIds2), array_diff($uniqueIds2, $uniqueIds1));

Это создает различия между массивами в обе стороны и объединяет их в один массив, например:

array('banana', 'apple')
array('strawberry', 'apple')
-> array('banana', 'strawberry')

См. array_diff.

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

array_filter($array1, function ($item) use ($reallyUniqueIds) {
    return in_array($item['unique_id'], $reallyUniqueIds);
})

Это просто использует пользовательскую функцию обратного вызова для array_filter, которая говорит ей фильтровать элементы, где in_array($item['unique_id'], $reallyUniqueIds) равно false.

0 голосов
/ 28 декабря 2011
  1. объединить все "unique_id" во всех массивах.
  2. Отфильтруйте дубликаты, чтобы получить уникальные символы.
  3. фильтрует все массивы на основе уникальных значений.

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

list($unique1, $unique2) = joined_uniquekey('unique_id', $array1, $array2);

Код:

function joined_uniquekey($key, $array1, $array2)
{
    $arrays = func_get_args(); $key = array_shift($arrays);
    $vkey = function($v) use ($key) {return $v[$key];};
    $map = function($f) {return function(array $as) use ($f) {return array_map($f, $as);};};
    $keys = array_count_values(call_user_func_array('array_merge', array_map($map($vkey), $arrays)));
    foreach($keys as $k => $c) if ($c > 1) unset($keys[$k]);
    $hkey = function($v) use ($key, $keys) {return isset($keys[$v[$key]]);};
    $filter = function($f) {return function(array $a) use ($f) {return array_filter($a, $f);};};
    return array_map($filter($hkey), $arrays);
}
0 голосов
/ 28 декабря 2011
foreach ( $array1 as $key1 => $innerarray1 ) {

  foreach ( $array2 as $key2 => $innerarray2 ) {

    if ($innerarray1['unique_id'] == $innerarray2['unique_id']) {

       unset($array2[$key2]);           
 }

}

Теперь $ array2 будет содержать не общие значения unique_id

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...