I am working with a one dimensional array in PHP. I would like to detect the presence of duplicate values, then count the number of duplicate values and out put the results. For example, given the following array:
$array = array('apple', 'orange', 'pear', 'banana', 'apple',
'pear', 'kiwi', 'kiwi', 'kiwi');
I would like to print:
apple (2)
orange
pear (2)
banana
kiwi (3)
Any advice on how to approach this problem?
Thanks.
Mike
Source: Tips4all
use array_count_values
ReplyDelete$array = array('apple', 'orange', 'pear', 'banana', 'apple',
'pear', 'kiwi', 'kiwi', 'kiwi');
print_r(array_count_values($array));
will output
Array
(
[apple] => 2
[orange] => 1
[pear] => 2
etc...
)
if(count(array_unique($array))<count($array))
ReplyDelete{
// Array has duplicates
}
else
{
// Array does not have duplicates
}
to get rid use array_unique. To detect if have any use count(array_unique) and compare to count(original array).
ReplyDeletefunction array_not_unique( $a = array() )
ReplyDelete{
return array_diff_key( $a , array_unique( $a ) );
}
Stuff them into a map (pseudocode)
ReplyDeletemap[string -> int] $m
foreach($word in $array)
{
if(!$m.contains($word))
$m[$word] = 0;
$m[$word] += 1;
}
Perhaps something like this (untested code but should give you an idea)?
ReplyDelete$new = array();
foreach ($array as $value)
{
if (isset($new[$value]))
$new[$value]++;
else
$new[$value] = 1;
}
Then you'll get a new array with the values as keys and their value is the number of times they existed in the original array.
You could try turning that array into a associative array with the fruits as keys and the number of occurrences as values. Bit long-winded, but it looks like:
ReplyDelete$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 />";
}