5

一番下の配列の例では、配列内に埋め込まれた各配列の深さを追加できるようにしたいと考えています。例えば:

    配列 (
      53 =>
      配列 (
        'タイトル' => 'ホーム',
        'パス' => '',
        'タイプ' => '118',
        'ピッド' => 52,
        'hasChildren' => 0,
      )、

以下に示すサンプル配列によると、深さは 1 であるため、次のようになります。

    配列 (
      53 =>
      配列 (
        'タイトル' => 'ホーム',
        'パス' => '',
        'タイプ' => '118',
        'ピッド' => 52,
        'hasChildren' => 0,
        '深さ' => 1,
      )、

等々...

私が行った再帰配列関数の試みはすべてかなり恥ずかしいものです。ただし、 getDepth 関数を持つ RecursiveArrayIterator を見てきました。現在の配列に追加する方法について混乱しています...どんな助けでも大歓迎です、ありがとう。

 
  配列 (
    'title' => 'ウェブサイトのナビゲーション',
    'パス' => '',
    'タイプ' => '115',
    'ピッド' => 0,
    'hasChildren' => 1,
    '子供' =>
    配列 (
      53 =>
      配列 (
        'タイトル' => 'ホーム',
        'パス' => '',
        'タイプ' => '118',
        'ピッド' => 52,
        'hasChildren' => 0,
      )、
      54 =>
      配列 (
        'タイトル' => '機能',
        'パス' => '機能',
        'タイプ' => '374',
        'ピッド' => 52,
        'hasChildren' => 1,
        '子供' =>
        配列 (
          59 =>
          配列 (
            'タイトル' => '芸術的',
            'path' => 'features/artistic',
            'タイプ' => '374',
            'ピッド' => 54,
            'hasChildren' => 1,
            '子供' =>
            配列 (
              63 =>
              配列 (
                'タイトル' => 'ギャラリー',
                'path' => 'features/artistic/gallery',
                'タイプ' => '374',
                'ピッド' => 59,
                'hasChildren' => 1,
                '子供' =>
                配列 (
                  65 =>
                  配列 (
                    'タイトル' => 'グラフィック',
                    'path' => 'features/artistic/galleries/graphics',
                    'タイプ' => '118',
                    'ピッド' => 63,
                    'hasChildren' => 0,
                  )、
                  67 =>
                  配列 (
                    'タイトル' => 'ミクストメディア',
                    'path' => 'features/artistic/galleries/mixed-medium',
                    'タイプ' => '118',
                    'ピッド' => 63,
                    'hasChildren' => 0,
                  )、
                  64 =>
                  配列 (
                    'タイトル' => '概要',
                    'path' => 'features/artistic/gallery',
                    'タイプ' => '118',
                    'ピッド' => 63,
                    'hasChildren' => 0,
                  )、
                  68 =>
                  配列 (
                    'タイトル' => '写真',
                    'パス' => '機能/芸術/ギャラリー/写真',
                    'タイプ' => '118',
                    'ピッド' => 63,
                    'hasChildren' => 0,
                  )、
                  66 =>
                  配列 (
                    'タイトル' => 'トラディショナル',
                    'path' => 'features/artistic/gallerys/traditional',
                    'タイプ' => '118',
                    'ピッド' => 63,
                    'hasChildren' => 0,
                  )、
                )、
              )、
              62 =>
              配列 (
                'タイトル' => '概要',
                'path' => 'features/artistic',
                'タイプ' => '118',
                'ピッド' => 59,
                'hasChildren' => 0,
              )、
              69 =>
              配列 (
                'タイトル' => 'チュートリアル',
                'path' => 'features/artistic/tutorials',
                'タイプ' => '374',
                'ピッド' => 59,
                'hasChildren' => 1,
                '子供' =>
                配列 (
                  71 =>
                  配列 (
                    'タイトル' => 'カテゴリ別',
                    'path' => 'features/artistic/tutorials/by-category/',
                    'タイプ' => '118',
                    'ピッド' => 69,
                    'hasChildren' => 0,
                  )、
                  72 =>
                  配列 (
                    'タイトル' => '日付別',
                    'path' => 'features/artistic/tutorials/by-date/',
                    'タイプ' => '118',
                    'ピッド' => 69,
                    'hasChildren' => 0,
                  )、
                  70 =>
                  配列 (
                    'タイトル' => '概要',
                    'path' => 'features/artistic/tutorials',
                    'タイプ' => '118',
                    'ピッド' => 69,
                    'hasChildren' => 0,
                  )、
                )、
              )、
            )、
          )、
          58 =>
          配列 (
            'タイトル' => '概要',
            'パス' => '機能',
            'タイプ' => '118',
            'ピッド' => 54,
            'hasChildren' => 0,
          )、
          61 =>
          配列 (
            'タイトル' => 'プロジェクト / ラボ',
            'path' => 'features/projects-labs/',
            'タイプ' => '374',
            'ピッド' => 54,
            'hasChildren' => 0,
          )、
          60 =>
          配列 (
            'タイトル' => 'ウェブ開発',
            'path' => 'features/web-development',
            'タイプ' => '374',
            'ピッド' => 54,
            'hasChildren' => 1,
            '子供' =>
            配列 (
              74 =>
              配列 (
                'タイトル' => '記事',
                'path' => 'features/web-development/articles/',
                'タイプ' => '374',
                'ピッド' => 60,
                'hasChildren' => 0,
              )、
              73 =>
              配列 (
                'タイトル' => '概要',
                'path' => 'features/web-development',
                'タイプ' => '118',
                'ピッド' => 60,
                'hasChildren' => 0,
              )、
              75 =>
              配列 (
                'タイトル' => 'チュートリアル',
                'path' => 'features/web-development/tutorials',
                'タイプ' => '374',
                'ピッド' => 60,
                'hasChildren' => 0,
              )、
            )、
          )、
        )、
      )、
      55 =>
      配列 (
        'タイトル' => '活動',
        'パス' => 'アクティビティ',
        'タイプ' => '374',
        'ピッド' => 52,
        'hasChildren' => 0,
      )、
      56 =>
      配列 (
        'タイトル' => 'ブログ',
        'パス' => 'ブログ',
        'タイプ' => '374',
        'ピッド' => 52,
        'hasChildren' => 0,
      )、
      57 =>
      配列 (
        'タイトル' => '概要',
        'パス' => 'について',
        'タイプ' => '374',
        'ピッド' => 52,
        'hasChildren' => 1,
        '子供' =>
        配列 (
          76 =>
          配列 (
            'タイトル' => '作者',
            'path' => 'about/the-author',
            'タイプ' => '118',
            'ピッド' => 57,
            'hasChildren' => 0,
          )、
          77 =>
          配列 (
            'タイトル' => 'ウェブサイト',
            'path' => 'about/the-website',
            'タイプ' => '118',
            'ピッド' => 57,
            'hasChildren' => 0,
          )、
        )、
      )、
    )、
  )、
);

print_r($example);

?>
4

5 に答える 5

8

サンプルコードには含まれていない別の配列(上部にあると思います。このようなものですか?

function array_set_depth($array, $depth = -1)
{
  $subdepth = $depth + 1;
  if ($depth < 0) {
    foreach ($array as $key => $subarray) {
      $temp[$key] = array_set_depth(($subarray), $subdepth);
    }
  }
  if ($array['hasChildren'] && isset($array['children'])) {
    foreach ($array['children'] as $key => $subarray) {
      $temp[$key] = array_set_depth($subarray, $subdepth);
    }
    $array['children'] = $temp;
  }
  $array['depth'] = $depth;
  return $array;
}

使用例として、配列を値 $a に設定します。

$b = array_set_depth($a);
print_r($b);

編集:

適切な印刷のために子の前に深さを設定するには、次のようにします。

function array_set_depth($array, $depth = -1)
{
  $subdepth = $depth + 1;
  if ($depth < 0) {
    foreach ($array as $key => $subarray) {
      $temp[$key] = array_set_depth(($subarray), $subdepth);
    }
    return $temp;
  }
  $array['depth'] = $depth;
  if ($array['hasChildren'] && isset($array['children'])) {
    foreach ($array['children'] as $key => $subarray) {
      $temp[$key] = array_set_depth($subarray, $subdepth);
    }
    unset($array['children']);
    $array['children'] = $temp;
  }
  return $array;
}
于 2009-01-12T12:06:49.137 に答える
5

この例で動作するように変更された Pauls コード。

function setDepth(&$a, $depth = -1)
{
    if (($depth > -1) && !($depth % 2))
      $a['depth']= $depth / 2;
    foreach($a as $key=>$value)
    {
        if (is_array($value))
           setDepth($a[$key], $depth+1);
    }

}
setDepth($a);
print_r($a);
于 2009-01-12T13:20:02.500 に答える
0

このようなsthはトリックを行う必要があります:

function setdepth($arr, $depth = 0)
{
    foreach ($arr as $key => $val)
    {
        $arr[$key]['depth'] = $depth;
        if ($arr[$key]['hasChildren'])
        {
            setdepth(&$arr[$key]['children'], $depth+1);
        }
    }
}

配列が値ではなくインデックスで始まっていると簡単になるので、使用例は次のようになります。

$arr[0] = $website;
setdepth(&$arr, 0);

どこのウェブサイトはあなたの例の配列です

于 2009-01-12T11:56:20.453 に答える
0

これは役立つかもしれません:

function extend( $arr, $myArr=array() ) {

    foreach( $arr as $key => $value ) {
        if( is_array( $key ) ) {
            extend( $arr[ $key ] );
        } else {
            $myArr[ $key ] = $arr[ $key ];
        }
    }

    return $myArr;
}

配列を新しい配列にコピーするだけでなく、既存の配列を拡張することもできるため、「拡張」と呼ばれる関数。

配列を拡張するには、それを 2 番目のパラメーターとして配置する必要があります。それ以外の場合は、空の配列を配置します。関数は配列のプロパティを調べて、それが配列であるかどうかをチェックし、関数が再度呼び出された場合は、値を別の配列にコピーして返します。

于 2011-12-17T01:14:15.933 に答える