0

フォルダーの配列からフォルダー構造のような配列を作成するのに問題があります。

これは関数が受け取る配列です

Array
(
[0] => Array
    (
        [id] => 6
        [name] => 2011
        [parent_folder] => 1
    )

[1] => Array
    (
        [id] => 5
        [name] => 2012
        [parent_folder] => 1
    )

[2] => Array
    (
        [id] => 7
        [name] => April
        [parent_folder] => 6
    )

[3] => Array
    (
        [id] => 2
        [name] => Folder2
        [parent_folder] =>
    )

[4] => Array
    (
        [id] => 1
        [name] => Folder1
        [parent_folder] =>
    )
)

出力は、partent_folder の配列内のキー「content」の下にサブフォルダーが配列として格納される配列である必要があります。

Array
(
[0] => Array
    (
        [id] => 2
        [name] => Folder2
        [parent_folder] =>
    )

[1] => Array
    (
        [id] => 1
        [name] => Folder1
        [parent_folder] =>
        [content] => Array
            (
                [0] => Array
                    (
                        [id] => 6
                        [name] => 2011
                        [parent_folder] => 1
                        [content] => Array
                            (
                                [0] => Array
                                    (
                                        [id] => 7
                                        [name] => April
                                        [parent_folder] => 6
                                    )
                            )
                    )

                [1] => Array
                    (
                        [id] => 5
                        [name] => 2012
                       [parent_folder] => 1
                    )

            )
    )
)

私は試してみましたが、動作させることができません。配列を再配置するには、再帰的な方法が必要です。誰でも助けることができますか?大歓迎です!

4

3 に答える 3

1

元の配列が呼び出されたとしましょう

$tree;

そこの各要素は配列であり、3 つの名前付きエントリがあります。

  1. id- 自分自身を表す - さらに呼び出された$idName,
  2. name- いくつかの文字列 - さらに呼び出された$parentName,
  3. parent- 親を代表する - さらに呼ばれる$childrenName

フラットからツリーに転置するには、各子がその親に対応できる必要があります。したがって、ID によるすべてのツリー要素へのエイリアスを持つ一時的な配列が作成されます。簡単に名前を付けて$t作成します。

foreach ($tree as $k => $v)
    $t[$v[$idName]] = &$tree[$k];

このエイリアス テーブルのおかげで、子をその親に割り当てることができるようになったため (親がそうでない場合FALSE)、再配置は非常に簡単です。

foreach ($tree as $k => $v)
    if (($p = $v[$parentName]) && ($t[$p][$childrenName][] = &$t[$v[$idName]]))
        unset($tree[$k]);

これが完了すると、別名テーブルは不要になり、設定を解除できます。

 unset($t);

ほら、ツリーの準備ができました:

 var_dump($tree);

出力:

array(2) {
  [3]=> array(3) {
    ["id"]=> string(1) "2"
    ["name"]=> string(7) "Folder2"
    ["parent_folder"]=> NULL
  }
  [4]=> array(4) {
    ["id"]=> string(1) "1"
    ["name"]=> string(7) "Folder1"
    ["parent_folder"]=> NULL
    ["content"]=> array(2) {
      [0]=> array(4) {
        ["id"]=> string(1) "6"
        ["name"]=> string(4) "2011"
        ["parent_folder"]=> string(1) "1"
        ["content"]=> array(1) {
          [0]=> array(3) {
            ["id"]=> string(1) "7"
            ["name"]=> string(5) "April"
            ["parent_folder"]=> string(1) "6"
          }
        }
      }
      [1]=> array(3) {
        ["id"]=> string(1) "5"
        ["name"]=> string(4) "2012"
        ["parent_folder"]=> string(1) "1"
      }
    }
  }
}
于 2012-04-17T18:49:29.697 に答える
0

この質問が古いことは知っていますが、提供された回答がうまくいきませんでした。解決策の最初の部分は、ハクレの答えから導き出されました。これは私がやったことです:

global $t;

foreach ($tree as $key => $value){
    $idName = $value['id'];
    $t[$idName] = $tree[$key];
}

foreach ($t as $key => $value){
    //echo $value['name'] . '<br />';
    $t[$key]['uri'] = recursiveArray($value).'/'.$value['name'];
    //echo '<br />';
}

function recursiveArray($value) {
    global $t;    

        if ($value['parentId'] != 0){            
            $parentName = $t[$value['parentId']]['name'];
            //$parentId = $value['parentId'];
            return recursiveArray($t[$value['parentId']]).'/'.$parentName;
        }        
        return '';
}

treeOPの配列と同じように見える配列です。結果は、ネストされた配列の代わりに、ファイルのネストがuri各配列の値で返されるという点で、見た目が異なります。

[76] => Array
    (
        [id] => 76
        [parentId] => 17
        [name] => Evite Templates
        [uri] => /Resources/Tools and Forms/General Tools and Forms/Countdown Events/Evite Templates
    )

[79] => Array
    (
        [id] => 79
        [parentId] => 90
        [name] => Celebration Meeting
        [uri] => /Resources/Tools and Forms/General Tools and Forms/Celebration Meeting
    )

[80] => Array
    (
        [id] => 80
        [parentId] => 90
        [name] => Recruitment Meeting
        [uri] => /Resources/Tools and Forms/General Tools and Forms/Recruitment Meeting
    )
于 2013-11-08T14:23:41.133 に答える
0

次のような設定が必要です。

function look_through_array($array) {
for ($i=0; $i<sizeof($array); $i++) {
    if (is_array($array[$i]))
        look_through_array($array[$i]);
    else
        create_folder($array[$i]);
}
}

function create_folder($array) {
    # make a folder
}
于 2012-04-17T14:18:23.117 に答える