【问题标题】:Count consecutive repeated elements in array in the same sequence as they are以与它们相同的顺序计算数组中连续重复的元素
【发布时间】:2020-03-24 20:19:30
【问题描述】:

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

例如我有流动数组:

$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

【问题讨论】:

标签: php arrays counting


【解决方案1】:

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

$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

【讨论】:

    【解决方案2】:

    从包含源中第一项(计数为 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
            )
    
    )
    

    【讨论】:

      【解决方案3】:

      这会循环遍历数组并增加$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
              )
      
      )
      

      【讨论】:

        【解决方案4】:

        通过迭代数组比较两个元素,如果两个元素相同,则增加计数,否则保持计数为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);
        

        【讨论】:

        • 这个答案缺少教育解释。
        • 这个看似未经测试的 sn-p 中有一个错字。此外,in_array() 是在 php 中检查数组中值的性能最低的方法之一。
        • 感谢@mickmackusa 指出我的错误。我改进了我的解决方案
        • 教育解释在哪里?
        • ++$finalArr[$index]['cnt']; 做同样的事情时,为什么还要写$finalArr[$index]['cnt'] = ++$finalArr[$index]['cnt'];?为什么要复制@Nigel 的答案并让它变得更糟?
        猜你喜欢
        • 1970-01-01
        • 2021-07-31
        • 2019-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多