计算数组内部的数组? 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);
如何具体计算数组内部的数组? 例如:
$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);