1

可能重复:
有没有办法找出 PHP 数组有多“深”?

我正在尝试编写一种方法来计算数组的维数。以下给了我正确的尺寸计数

$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

4 回答 4

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;
}
于 2012-11-12T23:30:25.933 回答
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;
}
于 2012-11-12T23:31:45.787 回答
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;
}
于 2012-11-12T23:29:08.777 回答
0

这里关于 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;
}
于 2012-11-12T23:29:56.880 回答