0

私のデータベースは、次のようなデータの階層配列を吐き出します。

Array(
    [0] => array(
        [level] => 0
        [wo_number] => foo1
        [parent] => NULL
    )
    [1] => array(
        [level] => 1
        [wo_number] => foo2
        [parent] => foo1
    )
    [2] => array(
        [level] => 2
        [wo_number] => bar1
        [parent] => foo2
    )
    [3] => array(
        [level] => 2
        [wo_number] => bar2
        [parent] => foo2
    )
    [4] => array(
        [level] => 2
        [wo_number] => bar3
        [parent] => foo2
    )
    [5] => array(
        [level] => 2
        [wo_number] => bar4
        [parent] => foo2
    )
    [6] => array(
        [level] => 2
        [wo_number] => bar5
        [parent] => foo2
    )
)

各配列ノードには、配列内の別のノードを参照する親キーがあります。

そして、配列を次のような形式に変換する必要があります。

Array(
    [0] => array(
        [level] => 0
        [wo_number] => foo1
        [parent] => NULL
        [children] => array(
            [0] => array(
                [level] => 1
                [wo_number] => foo2
                [parent] => foo1
                [children] => array(
                    etc etc etc
                )
            )
        )
    )
)

これで、json_encodeして、ExtJSTreePanelで使用できるようになります。

4

3 に答える 3

1

わずかに変更された関数を使用する(コメントでリンクしたものから):

/**
 * Helper function
 * 
 * @param array  $d flat data, implementing a id/parent id (adjacency list) structure
 * @param mixed  $r root id, node to return
 * @param string $p parent id index
 * @param string $k id index
 * @param string $c children index
 * @return array
 */
function flat2nested($d, $r = 0, $p = 'parent', $k = 'id', $c = 'children') {
  $m = array();
  foreach ($d as $e) {
    isset($m[$e[$p]]) ?: $m[$e[$p]] = array();
    isset($m[$e[$k]]) ?: $m[$e[$k]] = array();
    $m[$e[$p]][] = array_merge($e, array($c => &$m[$e[$k]]));
  }

  return $m[$r]; // removed the `[0]` here
}

次のような簡単な電話で行くことができます。

flat2nested($input, null, $p = 'parent', $k = 'wo_number');

現在、leafインデックスは設定されませんが、これは常にそう思われるのでfalse、入力配列に設定する方が簡単です。

デモ:http ://codepad.viper-7.com/IKRLUO

flat2nested(または)の内部動作について質問がある場合はmakeRecursive、コメントを残してください。回答を拡張します。

于 2012-09-19T07:34:37.307 に答える
0

ヨッシーが私に指示したmakeRecursive()関数を変更して、次のことを実行しました。

    public function makeRecursive($d, $r = 0, $pk = 'parent', $k = 'wo_number', $c = 'children') {
            $m = array();
            foreach ($d as $e) {
                    isset($m[$e[$pk]]) ?: $m[$e[$pk]] = array();
                    isset($m[$e[$k ]]) ?: $m[$e[$k ]] = array();
                    $m[$e[$pk]][] = array_merge($e, array($c => &$m[$e[$k]]));
            }
            $final = array(
                    'wo_number'=>$r,
                    'leaf'=>false,
                    'children'=>$m[$r]
            );
            return $final;
    }

そして、これは私の問題を解決しました!

于 2012-09-18T21:02:02.510 に答える
0

私は同じ問題を抱えており、構造体のストア拡張機能によってデータを受け取った後、javascriptで非常に簡単に解決されました{DictDataArray: [{Id, parentId, Name}]}

appendRawData: function(data){
            var me = this;
            var rNode = me.getRootNode();
            data = (Ext.isString(data) && Ext.decode(data)) || data;
            function ParentFilter(element, index, array){
                return element.ParentId == this.filterId;
            };

            function BuildTree(list, filter){
                var tmp = list.filter(ParentFilter, filter);
                if(tmp && tmp.length)
                {
                    var node= (filter.filterId && me.getById(filter.filterId)) || rNode;
                    node && node.appendChild && node.appendChild(tmp);
                }
                for(var item in tmp){
                    BuildTree(list, {filterId: tmp[item].Id});
                    var node= me.getById(tmp[item].Id);
                    node.set('leaf', !node.hasChildNodes());
                }
            };
            data && data.DictDataResult && BuildTree(data.DictDataResult, {filterId: null});
        },

単純な呼び出しをロードした後

store.appendRawData(response)

しかし、他の方法は、独自のリーダーを作成し、生データを読み取り、必要に応じて変換するこの関数をオーバーロードすることにより、データをloadDataに表すことです。

于 2013-04-25T16:26:56.077 に答える