按照相同的顺序计算数组中连续重复的元素

Count consecutive repeated elements in array in the same sequence as they are

我需要对数组中连续重复的元素进行计数,但如果它们不连续,我也想对它们进行计数,使它们与它们的顺序相同。

例如我有流动数组:

$array = Array('a', 'b', 'a', 'a', 'a', 'c', 'c', 'b', 'b', 'a', 'a', 'a', 'a');

如果我使用 array_count_values 函数 示例:

print_r(array_count_values($array));

输出将是:

Array ( [a] => 8 [b] => 3 [c] => 2 )

但我需要得到这样的输出:

element   counted value
    a       1
    b       1
    a       3
    c       2
    b       2
    a       4

您可以遍历数组,对相同的值进行计数,当它们不同时将值推送到结果数组:

$result = [];
$count = 0;
$current = $array[0];
for ($i = 0; $i < count($array); $i++) {
    if ($array[$i] == $current) {
        $count++;
    }
    else {
        $result[] = array($current, $count);
        $count = 1;
    }
    $current = $array[$i];
}
$result[] = array($current, $count);
print_r($result);

输出:

Array
(
    [0] => Array
        (
            [0] => a
            [1] => 1
        )
    [1] => Array
        (
            [0] => b
            [1] => 1
        )
    [2] => Array
        (
            [0] => a
            [1] => 3
        )
    [3] => Array
        (
            [0] => c
            [1] => 2
        )
    [4] => Array
        (
            [0] => b
            [1] => 2
        )
    [5] => Array
        (
            [0] => a
            [1] => 4
        )
)

Demo on 3v4l.org

从源中的第一项(计数为 1)的数组开始,然后从第二项开始并检查它是否与当前输出中的项匹配。如果匹配则添加 1,如果不匹配则添加一个新条目...

$array = Array ('a','b','a','a','a','c','c','b','b','a','a','a','a');
$output = [ ["element" => $array[0], "count" => 1 ] ];
$outputPoint = 0;
for ( $i = 1, $count = count($array); $i < $count; $i++ )   {
    if ( $array[$i] == $output[$outputPoint]["element"] )  {
        $output[$outputPoint]["count"]++;
    }
    else    {
        $output[++$outputPoint] = ["element" => $array[$i], "count" => 1 ];
    }
}
print_r($output);

哪个输出...

Array
(
    [0] => Array
        (
            [element] => a
            [count] => 1
        )

    [1] => Array
        (
            [element] => b
            [count] => 1
        )

    [2] => Array
        (
            [element] => a
            [count] => 3
        )

    [3] => Array
        (
            [element] => c
            [count] => 2
        )

    [4] => Array
        (
            [element] => b
            [count] => 2
        )

    [5] => Array
        (
            [element] => a
            [count] => 4
        )

)

这遍历数组并递增 $count 中的元素数。

$array = ['a','b','a','a','a','c','c','b','b','a','a','a','a'];

$count = [];
$crt   = -1;
foreach($array ?? [] as $element) {
    if($crt == -1 || $count[$crt]["element"] != $element) {
        $count[++$crt] = ["element" => $element, "counted_value" => 1];
    } else {
        $count[$crt]["counted_value"]++; 
    }
}

数组如下所示:

Array
(
    [0] => Array
        (
            [element] => a
            [counted_value] => 1
        )

    [1] => Array
        (
            [element] => b
            [counted_value] => 1
        )

    [2] => Array
        (
            [element] => a
            [counted_value] => 3
        )

    [3] => Array
        (
            [element] => c
            [counted_value] => 2
        )

    [4] => Array
        (
            [element] => b
            [counted_value] => 2
        )

    [5] => Array
        (
            [element] => a
            [counted_value] => 4
        )

)

通过迭代数组比较2个元素,如果两个元素相同,则增加计数,否则保持计数为1

$index = 0;
$finalArr[$index] = array('ele'=>$array[0],'cnt'=>1);

for($i=1; $i<count($array); $i++)
{
   if($array[$i]===$array[$i-1])
   {
      ++$finalArr[$index]['cnt'];
   }
   else
   {
      $finalArr[++$index] = array('ele'=>$array[$i],'cnt'=>1);
   }
}
print_r($finalArr);