计算数组内部的数组? PHP

Counting arrays inside of an array? PHP

如何具体计算数组内部的数组? 例如:

$array = [ 10, 'hello', [1, 2, 3, ['hi', 7]], [15, 67], 12 ]

输出应该是 3。

您可以为此使用递归函数。让我举个例子:

<?php

$array = [ 10, 'hello', [1, 2, 3, ['hi', 7]], [15, 67], 12 ];

$arrayCount = 0; # this variable will hold count of all arrays found

# Call a recursive function that starts with taking $array as an input
# Recursive function will call itself from within the function
countItemsInArray($array);


function countItemsInArray($subArray) {

    # access $arrayCount that is declared outside this function
    global $arrayCount;
    
    # loop through the array. Skip if the item is NOT an array
    # if it is an array, increase counter by 1
    # then, call this same function by passing the found array
    # that process will continue no matter how many arrays are nested within arrays
    foreach ($subArray as $x) {
        if ( ! is_array($x) ) continue;

        $arrayCount++;
        countItemsInArray($x);
    }

}


echo "Found $arrayCount arrays\n";

例子

https://rextester.com/SOV87180

说明

函数的运行方式如下。

  • [ 10, 'hello', [1, 2, 3, ['hi', 7]], [15, 67], 12 ] 被发送到 countItemsInArray 函数
  • 这个函数查看数组中的每一项
  • 10 条已审核。不是数组,所以函数转到下一项
  • 'hello' 已审核。不是数组,所以函数转到下一项
  • [1, 2, 3, ['hi', 7]] 被评估。它是一个数组,因此 arrayCount 增加到 1 并调用相同的函数,但函数的输入现在是 [1, 2, 3, ['hi', 7].

记住,用整个数组调用的同一个函数并没有死。它只是在等待这个 countItemsInArray([1, 2, 3, ['hi', 7]]) 完成

  • 1 被评估。它不是一个数组,所以计算下一项
  • 2 被评估...
  • 3 被评估...
  • ['hi', 7] 被评估。它是一个数组。因此,数组计数增加到 2
  • countItemsInArray(['hi', 7]) 被调用。

记住以完整数组作为参数的 countItemsInArray AND countItemsInArray([1, 2, 3, ['hi', 7]]) 现在正在等待 countItemsInArray(['hi', 7])完成

  • hi 被评估。那不是数组,所以函数测试下一项
  • 7 被评估。那也不是数组。因此,该函数完成,将控制权交还给 countItemsInArray([1, 2, 3, ['hi', 7]])

countItemsInArray([1, 2, 3, ['hi', 7]]) 认识到它没有更多要评估的东西。控制权交还给 countItemsInArray($array)。

  • [15, 67] 被评估。它是一个数组,所以数组数增加到 3
  • countItemsInArray([15, 67]) 被调用,它评估 15 和 16 并确定其中 none 是一个数组,因此它将控制权交还给 countItemsInArray($array)

countItemsInArray($array) 计算 12 并确定它也不是数组。所以,它结束了它的工作。

然后,echo 回显数组计数为 3。

递归迭代您的输入数组并在数组中进入新级别后重新启动计数变量。每遇到一个数组就加一,递归。向上传递更深级别的计数,当级别完全遍历时,return 顶层的累积计数。

代码:(Demo)

$array = [10, [[[]],[]], 'hello', [1, 2, 3, ['hi', 7]], [15, 67], 12];

function array_tally_recursive(array $array): int {
    $tally = 0;
    foreach ($array as $item) {
        if (is_array($item)) {
            $tally += 1 + array_tally_recursive($item);
        }
    }
    return $tally;
}

echo array_tally_recursive($array);