计算多维数组中的项目数时出现奇怪的值
Weird values when calculating number of items in a multidimensional array
我遇到了问题 return 多维数组中的项目数量正确,但我不知道我做错了什么,所以我有点困惑。
// Build test array
$marks = Array();
$marks[] = array("id" => 1, "parent_id" => "0", "title" => "Games");
$marks[] = array("id" => 2, "parent_id" => "0", "title" => "Food");
$marks[] = array("id" => 3, "parent_id" => "0", "title" => "Houses");
$marks[] = array("id" => 4, "parent_id" => "0", "title" => "Cities");
$marks[2]['child'][] = array("id" => 4, "parent_id" => "0", "title" => "Big House");
$marks[2]['child'][] = array("id" => 4, "parent_id" => "0", "title" => "Small House");
$marks[2]['child'][] = array("id" => 4, "parent_id" => "0", "title" => "Castle");
$marks[2]['child'][1]['child'][] = array("id" => 4, "parent_id" => "0", "title" => "Living Room");
$marks[2]['child'][1]['child'][] = array("id" => 4, "parent_id" => "0", "title" => "Kitchen");
function count_recursive ($array, $limit) {
$count = 0;
foreach ($array as $id => $_array) {
if (is_array ($_array) && $limit > 0) {
$count += count_recursive ($_array, $limit - 1);
} else {
$count += 1;
}
}
return $count;
}
echo '###' . count_recursive($marks, 5);
echo '<pre>' . print_r($marks, 1) . '</pre>';
奇怪的是现在是 returning 27??当它应该是 9 时,我不明白它从哪里得到那个值。
我也测试了
echo count($marks, COUNT_RECURSIVE);
但是 return 是 38 所以我真的很困惑!
不胜感激。
您正在计算数组中的字段。您似乎在问如何计算每个都有一个 id 的整个数组等等——这就是产生 9 的结果。要做到这一点,而不是在 is_array 为假时递增计数,在它为真时递增。与其以递归方式传回该元素,不如查看它是否具有 ['child'] 并以递归方式传递该元素。否则,'child' 集合本身会被计算在内,您会得到 11。或者,您可以仅在设置 'id' 时增加计数器。
下面是 COUNT_RECURSIVE 得到 38 的方法:
$marks 有四个值,索引为 0、1、2 和 3。这样计数为 4。
$marks[0] 到 $marks[3] 每个都有三个命名元素:'id'、'parent_id' 和 'title',合起来是 12。现在计数是 16 .
$marks[2] 也有一个 'child'。那就是 17.
$marks[2]['child'] 具有三个索引为 0、1 和 2 的元素。这就是 20.
每个都有三个命名元素,共 29 个。
$marks[2]['child'][1] 有一个 'child',使 30.
它有元素 0 和 1,所以是 32。
这两个都有三个命名元素。 38.
我遇到了问题 return 多维数组中的项目数量正确,但我不知道我做错了什么,所以我有点困惑。
// Build test array
$marks = Array();
$marks[] = array("id" => 1, "parent_id" => "0", "title" => "Games");
$marks[] = array("id" => 2, "parent_id" => "0", "title" => "Food");
$marks[] = array("id" => 3, "parent_id" => "0", "title" => "Houses");
$marks[] = array("id" => 4, "parent_id" => "0", "title" => "Cities");
$marks[2]['child'][] = array("id" => 4, "parent_id" => "0", "title" => "Big House");
$marks[2]['child'][] = array("id" => 4, "parent_id" => "0", "title" => "Small House");
$marks[2]['child'][] = array("id" => 4, "parent_id" => "0", "title" => "Castle");
$marks[2]['child'][1]['child'][] = array("id" => 4, "parent_id" => "0", "title" => "Living Room");
$marks[2]['child'][1]['child'][] = array("id" => 4, "parent_id" => "0", "title" => "Kitchen");
function count_recursive ($array, $limit) {
$count = 0;
foreach ($array as $id => $_array) {
if (is_array ($_array) && $limit > 0) {
$count += count_recursive ($_array, $limit - 1);
} else {
$count += 1;
}
}
return $count;
}
echo '###' . count_recursive($marks, 5);
echo '<pre>' . print_r($marks, 1) . '</pre>';
奇怪的是现在是 returning 27??当它应该是 9 时,我不明白它从哪里得到那个值。
我也测试了
echo count($marks, COUNT_RECURSIVE);
但是 return 是 38 所以我真的很困惑!
不胜感激。
您正在计算数组中的字段。您似乎在问如何计算每个都有一个 id 的整个数组等等——这就是产生 9 的结果。要做到这一点,而不是在 is_array 为假时递增计数,在它为真时递增。与其以递归方式传回该元素,不如查看它是否具有 ['child'] 并以递归方式传递该元素。否则,'child' 集合本身会被计算在内,您会得到 11。或者,您可以仅在设置 'id' 时增加计数器。
下面是 COUNT_RECURSIVE 得到 38 的方法:
$marks 有四个值,索引为 0、1、2 和 3。这样计数为 4。
$marks[0] 到 $marks[3] 每个都有三个命名元素:'id'、'parent_id' 和 'title',合起来是 12。现在计数是 16 .
$marks[2] 也有一个 'child'。那就是 17.
$marks[2]['child'] 具有三个索引为 0、1 和 2 的元素。这就是 20.
每个都有三个命名元素,共 29 个。
$marks[2]['child'][1] 有一个 'child',使 30.
它有元素 0 和 1,所以是 32。
这两个都有三个命名元素。 38.