在数组数组中查找级别数量的算法

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>';
}