【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());
では。