2011-03-10 2 views
3

i ont ce tableau commecomment tableau groupe et les compter

$arr = array(1,1,1,2,2,3,3,1,1,2,2,3); 

j'ai trouvé une fonction array_count_values. mais il regroupera tous la même valeur et les comptera tous et cassera la séquence.

$result[1] = 5 
$result[2] = 4 
$result[3] = 3 

comment créer un groupe de tableaux de comptes qui suivra la séquence. le résultat que je veux vraiment est:

[1] = 3; 
[2] = 2; 
[3] = 2; 
[2] = 2; 
[3] = 1; 
+0

Avez-vous essayé une déclaration foreach? – Jason

+6

ce n'est pas un tableau valide que les clés doivent être uniques –

+0

que diriez-vous: 1-numéro => 1 compte => 3, 2 nombre => 2 compte => 2 .... –

Répondre

3

Il peut être fait simplement manuellement:

$arr = array(1,1,1,2,2,3,3,1,1,2,2,3); 

$result = array(); 
$prev_value = array('value' => null, 'amount' => null); 

foreach ($arr as $val) { 
    if ($prev_value['value'] != $val) { 
     unset($prev_value); 
     $prev_value = array('value' => $val, 'amount' => 0); 
     $result[] =& $prev_value; 
    } 

    $prev_value['amount']++; 
} 

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

var_dump($result); 
+0

un revêtement pour votre solution serait $ result = explode (',', implode (',', array_count_values ​​($ your_array))); – epynic

0

Voici la façon dont je le ferais:

function SplitIntoGroups($array) 
{ 
    $toReturnArray = array(); 
    $currentNumber = $array[0]; 
    $currentCount = 1; 
    for($i=1; $i <= count($array); $i++) 
    { 
     if($array[$i] == $currentNumber) 
     { 
      $currentCount++; 
     } 
     else 
     { 
      $toReturnArray[] = array($currentNumber, $currentCount); 
      $currentNumber = $array[$i]; 
      $currentCount = 1; 
     } 
    } 

    return $toReturnArray; 
} 

$answer = SplitIntoGroups(array(1,1,1,2,2,3,3,1,1,2,2,3)); 
for($i=0; $i<count($answer); $i++) 
{ 
    echo '[' . $answer[$i][0] . '] = ' . $answer[$i][1] . '<br />'; 
} 
+0

ne jamais utiliser count ($ array) dans une boucle for, son calculé dans chaque boucle, foreach() est une structure de boucle bien meilleure pour un tableau dans php de toute façon –

0
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

Si vous ne voulez pas la valeur dans le tableau

$result = explode(',' , implode(',', array_count_values($your_array))); 
12

Qu'en est-il de la fonction array_count_values de PHP?

<?php 
$array = array(1, "hello", 1, "world", "hello"); 
print_r(array_count_values($array)); 
?> 

sortie:

Array 
(
    [1] => 2 
    [hello] => 2 
    [world] => 1 
) 
+1

Tout simplement la meilleure façon de le faire, bien mieux que la réponse acceptée –

+0

@ClainDsilva il renvoie la mauvaise réponse si '¯ \ _ (ツ) _/¯' – zerkms

+0

Ceci devrait être accepté réponse – Danon

Questions connexes