SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

【php】配列の深さ(次元)を調べる方法

作ってみました。

この手の問題のポイントは再帰関数。関数の中で再び自分自身を呼び出すという点が、よくある普通の関数と異なるところ。

再帰は、「自分自身を呼び出す」のと同等に「自分自身を呼び出さない場合もある」のがポイント。
常に自分自身を呼び出したら無限ループです。
場合によって、自分自身を呼び出したり、呼び出さなかったりして、最終的にうまく処理を完了させる。
そして再帰は日常的によくあること。

  1. 辞書をひく
  2. 情報を探す
  3. 説明の中に他の項目を参照するように記載があれば、他の項目を見る(→1へ)

お題に関しては、こう。

  1. 引数を見る
  2. 配列だろうか、配列じゃないだろうか
  3. 配列ならばさらに中を見る(→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());

では。

関連するメモ

コメント