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

2番目の例でも、次元数の正しいカウントが得られます

$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 に答える