【php】配列の深さ(次元)を調べる方法
作ってみました。
この手の問題のポイントは再帰関数。関数の中で再び自分自身を呼び出すという点が、よくある普通の関数と異なるところ。
再帰は、「自分自身を呼び出す」のと同等に「自分自身を呼び出さない場合もある」のがポイント。
常に自分自身を呼び出したら無限ループです。
場合によって、自分自身を呼び出したり、呼び出さなかったりして、最終的にうまく処理を完了させる。
そして再帰は日常的によくあること。
- 辞書をひく
- 情報を探す
- 説明の中に他の項目を参照するように記載があれば、他の項目を見る(→1へ)
お題に関しては、こう。
- 引数を見る
- 配列だろうか、配列じゃないだろうか
- 配列ならばさらに中を見る(→1へ)、配列でないなら今何階層目か返す
では、本題の配列の深さ(次元)を調べる関数。
//短さ優先1行バージョン function array_depth($a, $c = 0) { return (is_array($a) && count($a)) ? max(array_map("array_depth", $a, array_fill(0, count($a), ++$c))) : $c; }
//ちょっと見やすく分解バージョン function array_depth($a, $c = 0) { if (is_array($a) && count($a)) { ++$c; $_c = array($c); foreach ($a as $v) { if (is_array($v) && count($v)) { $_c[] = array_depth($v, $c); } } return max($_c); } return $c; }
//たとえばこんな配列を用意して
$a = array();
$a[0] = 1;
$a[1] = 1;
$a[2] = array();
$a[2][0] = array();
$a[2][0][1] = 1;
$a[2][0][2] = 1;
$a[2][0][5] = array();
$a[2][0][5][9] = 1;
$a[2][0][5][7] = 1;
$a[3] = array();
$a[3][0] = 1;
$a[3][1] = 1;
$a[3][2] = array();
$a[3][2][3] = 1;
$a[4] = 1;
// 4が返ってきます
echo array_depth($a);
//こんなのを追加すると
$a[5][1][2][3][4][5] = 1;
// 6が返ってきます
echo array_depth($a);
// 0が返ってきます
echo array_depth(array());
では。
コメント