Как обнаружить повторяющиеся значения в массиве PHP?
Я работаю с одномерным массивом в PHP. Я хотел бы обнаружить наличие повторяющихся значений, затем подсчитать количество повторяющихся значений и вывести результаты. Например, учитывая следующий массив:
$array = array('apple', 'orange', 'pear', 'banana', 'apple',
'pear', 'kiwi', 'kiwi', 'kiwi');
Я хотел бы напечатать:
apple (2)
orange
pear (2)
banana
kiwi (3)
любые советы о том, как подойти к этой проблеме?
спасибо.
Майк
10 ответов:
можно использовать array_count_values функции
$array = array('apple', 'orange', 'pear', 'banana', 'apple', 'pear', 'kiwi', 'kiwi', 'kiwi'); print_r(array_count_values($array));
выводит
Array ( [apple] => 2 [orange] => 1 [pear] => 2 etc... )
if(count(array_unique($array))<count($array)) { // Array has duplicates } else { // Array does not have duplicates }
чтобы избавиться используйте
array_unique()
. Чтобы обнаружить, если есть какая-либо пользаcount(array_unique())
иcount($array)
.
вы можете попробовать превратить этот массив в ассоциативный массив с фруктами в качестве ключей и количеством вхождений в качестве значений. Немного затянуто, но это выглядит так:
$array = array('apple', 'orange', 'pear', 'banana', 'apple', 'pear', 'kiwi', 'kiwi', 'kiwi'); $new_array = array(); foreach ($array as $key => $value) { if(isset($new_array[$value])) $new_array[$value] += 1; else $new_array[$value] = 1; } foreach ($new_array as $fruit => $n) { echo $fruit; if($n > 1) echo "($n)"; echo "<br />"; }
запихните их в
map
(псевдокод)map[string -> int] $m foreach($word in $array) { if(!$m.contains($word)) $m[$word] = 0; $m[$word] += 1; }
возможно, что-то вроде этого (непроверенных код, но должно дать вам идею)?
$new = array(); foreach ($array as $value) { if (isset($new[$value])) $new[$value]++; else $new[$value] = 1; }
затем вы получите новый массив со значениями в качестве ключей и их значения, сколько раз они существовали в исходном массиве.
$count = 0; $output =''; $ischeckedvalueArray = array(); for ($i=0; $i < sizeof($array); $i++) { $eachArrayValue = $array[$i]; if(! in_array($eachArrayValue, $ischeckedvalueArray)) { for( $j=$i; $j < sizeof($array); $j++) { if ($array[$j] === $eachArrayValue) { $count++; } } $ischeckedvalueArray[] = $eachArrayValue; $output .= $eachArrayValue. " Repated ". $count."<br/>"; $count = 0; } } echo $output;
Я не нашел ответа, который искал, поэтому я написал эту функцию. Это сделает массив, который содержит только дубликаты между двумя массивами, но не печатает количество раз, когда элемент дублируется, поэтому он не отвечает непосредственно на вопрос, но я надеюсь, что это поможет кому-то в моей ситуации.
function findDuplicates($array1,$array2) { $combined = array_merge($array1,$array2); $counted = array_count_values($combined); $dupes = []; $keys = array_keys($counted); foreach ($keys as $key) { if ($counted[$key] > 1) {$dupes[] = $key;} } sort($dupes); return $dupes; } $array1 = [1,2,3,4,5]; $array2 = [4,5,6,7,8]; $dupes = findDuplicates($array1,$array2); print_r($dupes);
выходы:
Array ( [0] => 4 [1] => 5 )