2011-03-10 50 views
3

我有这样组如何排列并计数

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

阵列,我发现一个功能array_count_values。但它会将所有相同的值分组并统计它们并打破序列。

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

如何创建将遵循序列的count组数组。结果我真正想要的是:

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

您是否尝试过foreach语句? – Jason 2011-03-10 04:00:36

+6

这是不是一个有效的数组,因为钥匙需要是唯一的 – 2011-03-10 04:02:30

+0

如何:1 - 数量=> 1计数=> 3,2号=> 2计数=> 2 .... – 2011-03-10 04:03:47

回答

3

它可以简单地手工完成:

$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

您的解决方案的一个班轮将是$结果= explode(',',implode(',',array_count_values($ your_array))); – epynic 2015-02-26 07:00:12

0

这里是我会做的方式:

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

从不在循环中使用count($ array),它在每个循环中计算,foreach()是一个好得多的循环结构,用于php中的数组 – 2011-03-10 04:43:50

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

如果你不想要数组中的值

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

那么PHP的array_count_values函数呢?

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

输出:

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

只需最好的方法来做到这一点,远远好于接受的答案 – 2016-08-31 12:26:26

+0

@ClainDsilva它通过'¯\ _(ツ)_ /¯'返回错误的答案 – zerkms 2017-05-02 19:59:59

+0

这应该是接受的答案 – Danon 2017-05-26 17:17:24