在数组数组中查找级别数量的算法
Algorithm to find amount of levels in an array of arrays
我正在研究一种算法来计算数组数组中的级别数量。
我需要这个的原因是因为我需要从属于父类别的数据库中获取类别列表,并且根据这个数组的级别数量,我需要显示一定数量的类别列表(到 select 个类别)。
所以这将是每个级别类别的类别列表,例如
Vehicles
Cars
honda
Red
Blue
Yellow
ford
Red
suzuki
Red
Green
BMW
Motorcycles
bla bla
bla bla
Groceries
Fruits
Berries
Red
Strawberries
所以我需要一个函数来检查 selected 父级的级别数量,例如,如果我将车辆 ID 传递给 return 4 或 3(如果我们算的话)车辆为 0 级,所以我知道如果客户端 select 从第一个列表中编辑车辆,我将不得不再显示 3 个列表。
到目前为止,我没有用的是
function count_children_level($list_of_children, $start_depth = 0){
// if the data being passed is an array
if(is_array($list_of_children)){
// amount of nodes is equal to the
$max = $start_depth;
foreach($list_of_children as $i){
$result = count_children_level($i, $start_depth + 1);
if ($result > $max){
$max = $result;
}
}
return $max;
}
//if is not array
else {
return $start_depth;
}
}
我真的需要了解它是如何工作的,因为我必须使用几个像这样的函数,所以如果可以的话,请详细解释你的答案。
谢谢
嵌套数组的深度等于其中最大数组的深度+1。
所以对于你的递归函数,不是每次都传递整个数组,你可以进行实际的递归调用,只获取子数组的深度。所以这个函数 returns 1 个用于普通平面数组,每个级别额外 1 个。
<?php
function array_depth($array) {
// Determine largest sub-array. Start with 0 if there are no arrays at all.
$max = 0;
foreach ($array as $item) {
if (is_array($item)) {
// Make the recursive call, passing not $array, but the sub-array ($item)
// to the function again.
$depth = array_depth($item);
if ($depth > $max)
$max = $depth;
}
}
// Depth of this array is the depth of the largest sub-array + 1.
return $max + 1;
}
我是这样称呼它的:
echo array_depth(
array('x' =>
array('y' =>
array('z')))); // Returns 3.
我对@GolezTrol 在 中所说的内容的解释("The depth of a nested array is equal to the depth of the largest array in it + 1"):
function array_depth($a)
{
// If $a is not an array or it's an empty array then its depth is 1
if (! is_array($a) || count($a) == 0) {
return 0;
}
// Otherwise, add 1 to the maximum depth of the elements it contains
return 1 + max(array_map('array_depth', $a));
}
另一个解决方案是 RecursiveIteratorIterator class。这样就不需要递归函数了:
$array = array(
'Vehicles' => array(
'Cars' => array(
'honda' => array(
'Red',
'Blue',
'Yellow',
)
)
)
);
function getTotalDepth($array) {
$iterator = new RecursiveIteratorIterator(
new RecursiveArrayIterator($array)
);
$max = 0;
foreach ($iterator as $element) {
if (!$iterator->callHasChildren()) {
$max = max($max, $iterator->getDepth());
}
}
return $max;
}
echo getTotalDepth($array);
如果你想遍历整个数组也很有帮助:
$iterator = new RecursiveIteratorIterator(
new RecursiveArrayIterator($array),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $element) {
print_r($element);
echo '<br>';
}
我正在研究一种算法来计算数组数组中的级别数量。
我需要这个的原因是因为我需要从属于父类别的数据库中获取类别列表,并且根据这个数组的级别数量,我需要显示一定数量的类别列表(到 select 个类别)。
所以这将是每个级别类别的类别列表,例如
Vehicles
Cars
honda
Red
Blue
Yellow
ford
Red
suzuki
Red
Green
BMW
Motorcycles
bla bla
bla bla
Groceries
Fruits
Berries
Red
Strawberries
所以我需要一个函数来检查 selected 父级的级别数量,例如,如果我将车辆 ID 传递给 return 4 或 3(如果我们算的话)车辆为 0 级,所以我知道如果客户端 select 从第一个列表中编辑车辆,我将不得不再显示 3 个列表。
到目前为止,我没有用的是
function count_children_level($list_of_children, $start_depth = 0){
// if the data being passed is an array
if(is_array($list_of_children)){
// amount of nodes is equal to the
$max = $start_depth;
foreach($list_of_children as $i){
$result = count_children_level($i, $start_depth + 1);
if ($result > $max){
$max = $result;
}
}
return $max;
}
//if is not array
else {
return $start_depth;
}
}
我真的需要了解它是如何工作的,因为我必须使用几个像这样的函数,所以如果可以的话,请详细解释你的答案。
谢谢
嵌套数组的深度等于其中最大数组的深度+1。
所以对于你的递归函数,不是每次都传递整个数组,你可以进行实际的递归调用,只获取子数组的深度。所以这个函数 returns 1 个用于普通平面数组,每个级别额外 1 个。
<?php
function array_depth($array) {
// Determine largest sub-array. Start with 0 if there are no arrays at all.
$max = 0;
foreach ($array as $item) {
if (is_array($item)) {
// Make the recursive call, passing not $array, but the sub-array ($item)
// to the function again.
$depth = array_depth($item);
if ($depth > $max)
$max = $depth;
}
}
// Depth of this array is the depth of the largest sub-array + 1.
return $max + 1;
}
我是这样称呼它的:
echo array_depth(
array('x' =>
array('y' =>
array('z')))); // Returns 3.
我对@GolezTrol 在
function array_depth($a)
{
// If $a is not an array or it's an empty array then its depth is 1
if (! is_array($a) || count($a) == 0) {
return 0;
}
// Otherwise, add 1 to the maximum depth of the elements it contains
return 1 + max(array_map('array_depth', $a));
}
另一个解决方案是 RecursiveIteratorIterator class。这样就不需要递归函数了:
$array = array(
'Vehicles' => array(
'Cars' => array(
'honda' => array(
'Red',
'Blue',
'Yellow',
)
)
)
);
function getTotalDepth($array) {
$iterator = new RecursiveIteratorIterator(
new RecursiveArrayIterator($array)
);
$max = 0;
foreach ($iterator as $element) {
if (!$iterator->callHasChildren()) {
$max = max($max, $iterator->getDepth());
}
}
return $max;
}
echo getTotalDepth($array);
如果你想遍历整个数组也很有帮助:
$iterator = new RecursiveIteratorIterator(
new RecursiveArrayIterator($array),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $element) {
print_r($element);
echo '<br>';
}