Je travaille avec un tableau unidimensionnel en PHP. J'aimerais détecter la présence de valeurs en double, puis compter le nombre de valeurs en double et sortir les résultats. Par exemple, étant donné le tableau suivant:
$array = array('Apple', 'orange', 'pear', 'banana', 'Apple',
'pear', 'kiwi', 'kiwi', 'kiwi');
Je voudrais imprimer:
Apple (2)
orange
pear (2)
banana
kiwi (3)
Des conseils sur la façon d'aborder ce problème?
Merci.
Mike
Vous pouvez utiliser array_count_values function
$array = array('Apple', 'orange', 'pear', 'banana', 'Apple',
'pear', 'kiwi', 'kiwi', 'kiwi');
print_r(array_count_values($array));
va sortir
Array
(
[Apple] => 2
[orange] => 1
[pear] => 2
etc...
)
if(count(array_unique($array))<count($array))
{
// Array has duplicates
}
else
{
// Array does not have duplicates
}
function array_not_unique( $a = array() )
{
return array_diff_key( $a , array_unique( $a ) );
}
Pour vous en débarrasser, utilisez array_unique()
. Pour détecter si vous utilisez count(array_unique())
et comparez-le à count($array)
.
Vous pouvez essayer de transformer ce tableau en un tableau associatif avec les fruits comme clés et le nombre d'occurrences comme valeurs. Un peu long, mais il ressemble à:
$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 />";
}
<?php
$arr = array(1, 2, 3, 2, 5, 6, 7);
print_r(array_count_values($arr));
?>
Farcissez-les dans une map
(pseudocode)
map[string -> int] $m
foreach($Word in $array)
{
if(!$m.contains($Word))
$m[$Word] = 0;
$m[$Word] += 1;
}
Peut-être quelque chose comme ceci (code non testé mais devrait vous donner une idée)?
$new = array();
foreach ($array as $value)
{
if (isset($new[$value]))
$new[$value]++;
else
$new[$value] = 1;
}
Ensuite, vous obtiendrez un nouveau tableau avec les valeurs en tant que clés et leur valeur correspond au nombre de fois où ils ont existé dans le tableau d'origine.
$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;
Je n'ai pas trouvé la réponse que je cherchais, alors j'ai écrit cette fonction. Cela fera un tableau qui ne contient que les doublons entre les deux tableaux, mais n'indiquera pas le nombre de fois qu'un élément est dupliqué, il ne répond donc pas directement à la question, mais j'espère que cela aidera quelqu'un dans ma situation.
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);
Les sorties:
Array
(
[0] => 4
[1] => 5
)