计算数组中的维数

时间:2012-11-12 23:14:17

标签: php multidimensional-array

  

可能重复:
  Is there a way to find how how “deep” a PHP array is?

我正在尝试编写一个方法来计算数组的维数。以下给出了正确的维度计数

$array = array();
$array[0] = array();
$array[0][0] = 0;
$array[0][1] = array();
$array[0][1][0] = 10;
$array[0][1][1] = 11;

echo '<p>'.\utility\arrayTools\arrayTools::numberOfDimensions($array).'</p>';
//3 Dimensons

第二个例子也给了我正确的维度数

$array = array();
$array[0] = array();
$array[0][0] = 0;
$array[0][1] = array();
$array[0][1][0] = 10;
$array[0][1][1] = 11;
$array[1] = 1;
$array[2] = 2;
//3 Dimensions

但是下面的例子给了我太多的计数

$array = array();
$array[0] = array();
$array[0][0] = 0;
$array[0][1] = array();
$array[0][1][0] = 10;
$array[0][1][1] = 11;
$array[1] = 1;
$array[2] = 2;
$array[3] = array();
$array[3][0] = 30;
//Should still be 3 dimensions, but gives me 4

我正在使用的方法是

//Method
public static function numberOfDimensions($array)
{
    if(func_num_args() === 2){
        if(is_int(func_get_arg(1))){
            $number_of_dimensions = func_get_arg(1);
        }else{
            throw new Exception('The second argumment must be an interger');
        }
    }else{
        $number_of_dimensions = 0;
    }

    if(is_array($array) === TRUE){
        $number_of_dimensions++;

        if(self::isMultiDimensional($array) === TRUE){
            foreach($array as $iteration){
                $number_of_dimensions = self::numberOfDimensions($iteration,$number_of_dimensions);
            }
            return $number_of_dimensions;
        }else{
            return $number_of_dimensions;
        }
    }else{
        return $number_of_dimensions;
    }
}

我已经知道问题是它仍然为每个多维添加,即使计数可能等于或小于维数。但我无法弄清楚的是如何让它找到最大数量的维度并停止计算

4 个答案:

答案 0 :(得分:1)

以下是您的脚本的simpler版本

function numberOfDimensions($array) {
    $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
    $d = 0;
    foreach ( $it as $v )
        $it->getDepth() >= $d and $d = $it->getDepth();
    return ++ $d;
}

答案 1 :(得分:0)

此函数假定使用数组作为参数调用它,因此最小深度为1。

然后以递归方式查看所有子元素,如果孩子比已知的更深,则将子项的深度添加到计算的深度:

function numberOfDimensions($subject) {
    // scalar value has depth 0
    if(!is_array($subject)) return 0;

    // array has min depth of 1
    $depth = 1;
    foreach ($subject as $element) {
        if (is_array($element)) {
            // is the sub array deeper than already known?
            $sub_depth = numberOfDimensions($element);
            if ($sub_depth >= $depth) {
                $depth += $sub_depth;
            }
        }
    }
    return $depth;
}

答案 2 :(得分:0)

来自another answer here on SO

function array_depth($array) {
    $max_depth = 1;

    foreach ($array as $value) {
        if (is_array($value)) {
            $depth = array_depth($value) + 1;

            if ($depth > $max_depth) {
                $max_depth = $depth;
            }
        }
    }

    return $max_depth;
}

答案 3 :(得分:0)

我很长时间没有编写任何PHP,因此我的代码中可能会出现错误,请原谅。

function numberOfDimensions($array,$so_far=0){
    if !is_array($array){
        return 0;
    }
    $max_dims = 0;
    foreach($array as $element){
        $element_dims = numberOfDimensions($array);
        $max_dims = max($max_dims,$element_dims);
    }
    return $max_dims +1;
}