8

配列要素を再帰的にカウントする関数を作成しようとしています。

しかし、結果は偽です。

それは何が問題でしょうか?

$schema = array(
    'div' => array(
        'class' => 'lines',
        'div' => array(
             'span' => array(
                'key' => 'Product Name'
            ),
            'val' => 'Soap'
        ),
        'layer' => array(
             'span' => array(
                'key' => 'Product Name'
            ),
            'val' => 'Ball'
            )
        )
);

function count_r($array, $i = 0){
    foreach($array as $k){
        if(is_array($k)){ $i += count_r($k, count($k)); }
        else{ $i++; }
    }
    return $i;
}

echo count_r($schema);
4

6 に答える 6

37

これは Google での 2 番目の結果なので、参考として追加します。PHP には、使用できる組み込み関数count()が既にあります。

次のように使用できます。

count($schema, COUNT_RECURSIVE);

この関数は、再帰を検出して無限ループを回避することもできるため、他の回答のソリューションよりも安全です。

于 2014-02-06T14:06:22.790 に答える
12

PHP には、この目的のために と呼ばれる組み込みメソッドがありcount()ます。追加のパラメーターなしで渡された場合count()、最初のレベルの配列キーの数を返します。ただし、count メソッドcount( $schema, true )に 2 番目のパラメーターを渡すと、結果は多次元配列内のキーの総数になります。正解としてマークされた応答は、第 1 レベルと第 2 レベルの配列のみを反復します。その配列に 3 番目の子がある場合、正しい回答は返されません。

ただし、本当に独自の count() メソッドを記述したい場合は、これを再帰関数として記述できます。

于 2015-03-16T16:09:02.143 に答える
1

回答の下のコメントから転送:

基本的に、count_rその配列の を現在のレベルに追加しているので、2 番目の引数でカウントを考慮する必要はありません。基本的には 2 回追加することになります。ただし、配列自体をカウントするには、そこに「1」が必要です。配列ではなく要素だけを数えたい場合は、「1」を「0」にします。

$schema = array(
    'div' => array(
        'class' => 'lines',
        'div' => array(
             'span' => array(
                'key' => 'Product Name'
            ),
            'val' => 'Soap'
        ),
        'layer' => array(
             'span' => array(
                'key' => 'Product Name'
            ),
            'val' => 'Ball'
            )
        )
);

function count_r($array, $i = 0){
    foreach($array as $k){
        if(is_array($k)){ $i += count_r($k, 1); }
        else{ $i++; }
    }
    return $i;
}

echo count_r($schema);

これはテスト済みで、正しく動作します。

于 2013-08-25T14:33:51.517 に答える
0

あなたの関数は次のように単純かもしれません

function count_r($array, $i = 0){
    foreach($array as $k){
        $i++;
        if(is_array($k)){ 
            $i += count_r($k); 
        }
    }
    return $i;
}
于 2013-08-25T14:36:43.780 に答える