php возвращает только дублированные записи из массива

Я хочу получить все дублированные записи из массива. Возможно ли это в 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)));