Я хочу получить все дублированные записи из массива. Возможно ли это в PHP?
array( 1 => '1233', 2 => '12334', 3 => 'Hello', 4 => 'hello', 5 => 'U' );
Я хочу вернуть массив только с удвоенным значением: «привет».
Желаемый выходной массив:
array( 1 => 'Hello', 2 => 'hello' );
Вам нужно будет сделать ваш регистр функций нечувствительным, чтобы получить результат «Hello» => «hello», который вы ищете, попробуйте этот метод:
$arr = array(1=>'1233',2=>'12334',3 =>'Hello' ,4=>'hello', 5=>'U'); // Convert every value to uppercase, and remove duplicate values $withoutDuplicates = array_unique(array_map("strtoupper", $arr)); // The difference in the original array, and the $withoutDuplicates array // will be the duplicate values $duplicates = array_diff($arr, $withoutDuplicates); print_r($duplicates);
Выход:
Array ( [3] => Hello [4] => hello )
Редактировать по @AlixAxel:
Этот ответ очень вводит в заблуждение. Он работает только в этом конкретном состоянии. Этот встречный пример:
$arr = array(1=>'1233',2=>'12334',3 =>'Hello' ,4=>'HELLO', 5=>'U');
Слишком плохо . Кроме того, это не способ сохранить дубликаты:
array_diff($arr, array_unique($arr));
Так как одно из дублированных значений будет в array_unique
, а затем array_diff
.
Редактировать @RyanDay:
Поэтому посмотрите ответы @ Srikanth или @ Bucabay, которые работают во всех случаях (ищите регистр, нечувствительный к регистру в Bucabay's), а не только данные теста, указанные в вопросе.
<?php function array_not_unique($raw_array) { $dupes = array(); natcasesort($raw_array); reset($raw_array); $old_key = NULL; $old_value = NULL; foreach ($raw_array as $key => $value) { if ($value === NULL) { continue; } if (strcasecmp($old_value, $value) === 0) { $dupes[$old_key] = $old_value; $dupes[$key] = $value; } $old_value = $value; $old_key = $key; } return $dupes; } $raw_array = array(); $raw_array[1] = 'abc@xyz.com'; $raw_array[2] = 'def@xyz.com'; $raw_array[3] = 'ghi@xyz.com'; $raw_array[4] = 'abc@xyz.com'; // Duplicate $common_stuff = array_not_unique($raw_array); var_dump($common_stuff);
function get_duplicates ($array) { return array_unique( array_diff_assoc( $array, array_unique( $array ) ) ); }
function array_not_unique($raw_array) { $dupes = array(); natcasesort($raw_array); reset($raw_array); $old_key = NULL; $old_value = NULL; foreach ($raw_array as $key => $value) { if ($value === NULL) { continue; } if (strcasecmp($old_value, $value) === 0) { $dupes[$old_key] = $old_value; $dupes[$key] = $value; } $old_value = $value; $old_key = $key; } return $dupes; }
Что добавил Шрикант (john), но с нечувствительным к регистру.
Это правильный способ сделать это (с учетом регистра):
array_intersect($arr, array_unique(array_diff_key($arr, array_unique($arr))));
И безболезненное решение:
$iArr = array_map('strtolower', $arr); $iArr = array_intersect($iArr, array_unique(array_diff_key($iArr, array_unique($iArr)))); array_intersect_key($arr, $iArr);
Но ответ @Srikanth более эффективен (фактически, это единственный, который работает правильно, кроме этого).
Пытаться:
$arr2 = array_diff_key($arr, array_unique($arr));
без учета регистра:
array_diff_key($arr, array_unique(array_map('strtolower', $arr)));