count関数の第2引数にCOUNT_RECURSIVEを渡した時の返り値について【PHP】

  • 2020.03.10
  • PHP
count関数の第2引数にCOUNT_RECURSIVEを渡した時の返り値について【PHP】

count関数に第2引数があることを今更知った。 count関数とかprint_r関数とかhtmlspecialchars関数とか、PHPを勉強し始めたばかりのころに覚えた関数は、基本的な使い方を覚えているためマニュアルで見ることがなくて、省略された引数があることに気づくのがずいぶん遅くなった。 一度、マニュアルを見直した方がいいかもしれない。

それはそうと、count関数の第2引数に渡すCOUNT_RECURSIVEってどんなときに使うのだろう?

Advertisement

第2引数にCOUNT_RECURSIVEを渡した時の返り値

例えば、以下のようなデータがあるとする。

$data = array(
    'index.php',
    'css' => array(
        'main.css',
        'menu.css',
    ),
    'img' => array(
        'title.jpg',
        'back.gif',
        'menu' => array(
            '1.gif',
            '2.gif',
            '3.gif',
        ),
    ),
);

これに対して普通にcount関数を使うと3が返される。

echo count($data);

count関数の第2引数$modeにCOUNT_RECURSIVE(または 1)をセットした場合、配列を再帰的にカウントする。 このときcount関数は11を返す。

echo count($data, COUNT_RECURSIVE);

ここで「あれ?多すぎじゃね?」と思った人もいると思う。 この11というのは、配列そのものを1つと数え、さらにその子要素の数を数えた結果だ。

$data = array(
    'index.php',    //①
    'css' => array( //②
        'main.css', //③
        'menu.css', //④
    ),
    'img' => array( //⑤
        'title.jpg', //⑥
        'back.gif',  //⑦
        'menu' => array( //⑧
            '1.gif', //⑨
            '2.gif', //⑩
            '3.gif', //⑪
        ),
    ),
);

多すぎだと思った人は、配列そのものを数えずに個要素の数だけを数えると思ったのだろう。

$data = array(
    'index.php', //①
    'css' => array(
        'main.css', //②
        'menu.css', //③
    ),
    'img' => array(
        'title.jpg', //④
        'back.gif',  //⑤
        'menu' => array(
            '1.gif', //⑥
            '2.gif', //⑦
            '3.gif', //⑧
        ),
    ),
);

このような数え方をしたい場合には以下のような関数を自作する必要がある。

配列の個要素の数をカウントする方法

function recursive_count($array){
    $count = 0;
    foreach ($array as $key => $value){
        $count += (is_array($value))? recursive_count($value): 1;
    }
    return $count;
}
 
echo recursive_count($data);

通常は後者の数え方を期待して、多次元配列の子要素を数えたりする場合に使うと思うのだけど、COUNT_RECURSIVEはどんなときに使うのだろう? $modeと名前が付いているのだから、おそらく他の数え方も追加するつもりなのだろうが、先にコレを実装する意味がわからない。

Advertisement