【问题标题】:Multi-Dimensional array count in PHPPHP中的多维数组计数
【发布时间】:2012-02-22 04:22:15
【问题描述】:

我有一个多维数组设置如下

array() {
    ["type1"] =>
    array() {
        ["ticket1"] =>
        array(9) { 
           // ticket details here
        }
        ["ticket2"] =>
        array(10) { 
           // ticket details here
        }
        ["ticket3"] =>
        array(9) { 
           // ticket details here
        }
    }
    ["type2"] =>
    array() {
        ["ticket1"] =>
        array(9) { 
           // ticket details here
        }
        ["ticket2"] =>
        array(10) { 
           // ticket details here
        }
        ["ticket3"] =>
        array(9) { 
           // ticket details here
        }
    }
}

等等

我正在尝试计算数组中的票证总数(二级项目的数量),但类型的数量是可变的,因为每张票证的字段数也是可变的,所以我不能使用 COUNT_RECURSIVE和数学来得到这个数字。

谁能帮帮我?

【问题讨论】:

  • @MadaraUchiha 在循环中添加计数(以最好的为准)可能会更好,因为您不必迭代所有内容。

标签: php multidimensional-array


【解决方案1】:

最简单的方法是一个简单的 foreach 循环:

$count = 0;
foreach( $tickets as $ticketType){
    $count += count( $ticketType);
}

【讨论】:

  • 这应该可以,但是你的变量命名真的很混乱(困惑?)
  • @FrostyZ 我在那里拼错了,已修复,我还添加了 $type 前缀,这样会更清楚其中的内容。
【解决方案2】:
$count = 0;
foreach ($array as $type) {
    $count+= count($type);
}

【讨论】:

    【解决方案3】:

    有点晚了,但这是一种简洁的编写方式。

    $totalTickets = array_sum(array_map("count", $tickets));
    

    假设$tickets 是您的多维数组。

    我已经扩展了代码以给出一个解释示例,因为 array_map 可能对某些人来说是新的

    $tickets = array(
        "type1" => array(
            "ticket1" => array(),
            "ticket2" => array(),
            "ticket3" => array(),
        ),
        "type2" => array(
            "ticket4" => array(),
            "ticket5" => array(),
            "ticket6" => array(),
            "ticket7" => array(),
        ),
        "type3" => array(
            "ticket8" => array()
        )
    );
    
    // First we map count over every first level item in the array
    // giving us the total number of tickets for each type.
    $typeTotals = array_map("count", $tickets);
    
    // print_r($typeTotals);
    // $type_totals --> Array (
    //                       [type1] => 3,
    //                       [type2] => 4,
    //                       [type3] => 1 
    //                  )
    
    //Then we sum the values of each of these
    $totalTickets = array_sum($typeTotals);
    
    print($totalTickets);
    // $totalTickets --> 8
    

    所以因为我们不关心每种类型的中间结果,我们可以将结果输入array_sum

    $totalTickets = array_sum(array_map("count", $tickets));
    

    【讨论】:

      【解决方案4】:

      使用 Count Recursive 并减去 一级计数,如下所示:

      count($mainArr, COUNT_RECURSIVE) - count($mainArr);
      

      如果您的数组有 +3 级,只需添加 [?] 键:

      count($mainArr[1], COUNT_RECURSIVE) - count($mainArr[1]);
      

      【讨论】:

      • 如果我有 4 维数组怎么办?
      • 太棒了! @nashwa,递归将计算每个元素 IIRC,无论多深
      • 我希望我能给予声誉多次投票。为什么这不是公认的答案?
      • 对我来说count($arr, COUNT_RECURSIVE) 已经足够了,但是很好的答案,因为它允许更多的深度
      【解决方案5】:

      :)

      $test = array (
          array (
              'test','test','test'
          ),
          array (
          'test','test'
          ),
          array (
              array (
              'test'
              ),
              array (
              'test','test','test','test'
              )
          )
       );
       echo "  array count ". count($test[0]) ." <br /> ";
       echo "  array count ". count($test[1]) ." <br /> ";
       echo "  array count ". count($test[2]) ." <br /> ";
       echo "  array count ". count($test[2],1) ." <br /> ";
       echo "  array count ". (count($test[2],1) - count($test[2])) ." <br /> "; // all child num - parent num
       echo "  array count ". count($test[2][1]) ." <br /> ";
      

      输出:

      数组计数 3

      数组计数 2

      数组计数 2

      数组计数 7

      数组计数 5

      数组计数 4

      【讨论】:

        【解决方案6】:

        要计算票证总数,下面的代码将帮助您进行 PHP。

        foreach($mainArray as $Array){
            foreach($Array as $perTicke){
                $count++;
            }
        }
        $total_ticket = $count;
        

        【讨论】:

        • 不要为了获取元素数量而进行内部 foreach 循环。
        猜你喜欢
        • 1970-01-01
        • 2016-10-13
        • 1970-01-01
        • 2023-02-14
        • 2013-10-26
        • 2021-12-10
        • 2012-01-07
        • 2021-11-23
        • 1970-01-01
        相关资源
        最近更新 更多