10
votes

Comment compter les valeurs dupliquées consécutives dans un tableau?

J'ai un tableau comme ceci: xxx pré>

J'ai trouvé la fonction array_count_values ​​() code>, mais il regroupera toutes les mêmes valeurs et comptera les occurrences sans Respecter les pauses dans les séquences consécutives. P>

[1] = 3;
[2] = 2;
[3] = 2;
[1] = 2;
[2] = 2;
[3] = 1;


4 commentaires

Ce n'est pas un tableau valide car les touches doivent être uniques


Du: 1 -Nombre => 1 compte => 3, 2 Numéro => 2 Nombre => 2 ....


@Dagon, je pense que c'est ce qu'il affirme sur une matrice 2D ou en utilisant la déclaration =>.


Ceci s'appelle le codage de la longueur d'exécution.


6 Réponses :


14
votes

Il peut être fait simplement manuellement: xxx


1 commentaires

Au-delà du fait qu'il s'agit d'une réponse uniquement du code, pourquoi personne DV Cette solution correcte et intelligente? ... et pourtant la réponse votée la plus élevée est pratiquement incorrecte. Désolé Stack Overflow - Les électeurs vous permettent de vous laisser tomber sur cette page. Je serais probablement uv si il y avait une explication.



1
votes
$current = null;
foreach($your_array as $v) {
    if($v == $current) {
        $result[count($result)-1]++;
    } else {
        $result[] = 1;
        $current = $v;
    }
}

var_dump($result);

2 commentaires

une doublure pour votre solution serait $ Résultat = exploser (',', implorez (',', array_count_values ​​($ your_array)));


Cette réponse perd la relation entre le nombre répété dans une séquence donnée et la longueur de la séquence. Amber, veuillez améliorer cette réponse de ce code.



-1
votes

Voici la façon dont je le ferais: xxx


2 commentaires

N'utilisez jamais de comptage ($ de tableau) à l'intérieur d'une boucle, sa calculée dans toutes les boucles, foreach () est une structure de boucle beaucoup meilleure pour un tableau en PHP de toute façon


Cet extrait génère des avis de compensation indéfinis et ne doit pas être utilisé.



0
votes
function findRepetitions($times, $array) {

    $values = array_unique($array);

    $counts = [];
    foreach($values as $value) {
        $counts[] = ['value' => $value, 'count' => 0];
    }

    foreach ($array as $value) {
        foreach ($counts as $key => $count) {
            if ($count['value'] === $value) {
                $counts[$key]['count']++;
            }
        }
    }

    $repetitions = [];
    foreach ($counts as $count) {
        if ($count['count'] === $times) {
            $repetitions[] = $count['value'];
        }
    }

    return $repetitions;
}

1 commentaires

Cette réponse que cette seule réponse a besoin de son explication. Pourquoi existe-t-il un paramètre $ fois $ HOPS ?



7
votes

Qu'en est-il de PHP's Array_Count_Values ​​ fonction? XXX

sortie: xxx


2 commentaires

@Claindsilva Il renvoie la mauvaise réponse bien que ¯ \ _ (ツ) _ / ¯


Je ne sais pas pourquoi tant de gens ont suscité cette réponse incorrecte. Pour faire tourner mon phrasé, c'est la bonne réponse à une question différente.



3
votes

Ma suggestion est d'extraire et de retirer la première valeur du tableau avant d'entrer dans la boucle et d'utiliser un tableau temporaire ( $ Carry code>) pour suivre si chaque nouvelle valeur correspond à la touche de la matrice de transport. Si oui, incrémentez-le. Sinon, appuyez sur le nombre de séquences terminé dans le réseau de résultat et écrasez-le avec la nouvelle valeur et définissez le compteur sur 1. Lorsque la boucle se termine, poussez la portée persistante dans le jeu de résultats. Mon extrait ne vérifie pas si le tableau d'entrée est vide; Si nécessaire, ajoutez cette condition à votre projet.

code: ( Démo ) P>

$result = [];
$carry = [];
foreach ($array as $value) {
    if ($carry && key($carry) === $value) {
        ++$carry[$value];
    } else {
        unset($carry);
        $carry = [$value => 1];
        $result[] = &$carry;
    }
}
unset($carry);
print_r($result);


0 commentaires