1

階層的な配列構造を構築する際に問題が発生しています - ほぼ完了しましたが、原因不明の原因で配列が奇妙に見えることがあります。

ツリー構造は次のとおりです。

root
|data
|-children
|--data
|--children
|---data
|---children

どの子も任意の数の子を持つことができ、各子は任意の数の親を持つことができます。

私はツリーを構築する関数を持っています:

private function build_tree($rows,$parent) {
    $i = 0;
    $response -> result = array();
    $result = array();
    $leaf = false;

    foreach($rows as $row) {
        if($row['parent_id'] == $parent) {
            $leaf = is_null($row['treeDef']) ? false : true;
            $workingSet = array_merge($result,array(                
                'id' => (int)$i, 
                'parent_id' => (int)$row['parent_id'], 
                'child_id' => (int)$row['id'], 
                'name' => (string)$row['resourceName'], 
                'updated' => strtotime($row['updated']), 
                'purchasedUnit' => (string)$row['purchasingUnit'], 
                'purchasedCost' => (double)$row['purchasingCosts'], 
                'purchasedDiscount' => (double)$row['discount'], 
                'estimateUnit' => (string)$row['estimatingUnit'], 
                'profitAddOn' => (string)$row['profitAddOn'], 
                'landedCost' => (double)$row['landedCost'], 
                'unitCorrelation' => (double)$row['unitCorrelation'], 
                'leadTime' => (string)$row['leadTime'], 
                'ResourceClassShortname' => (string)$row['ResourceClassShortname'], 
                'supplierName' => (string)$row['nameSupplier'],
                'iconCls' => (string)$row['typeIcon'],
                'leaf' => $leaf
            ));
            $hasChildren = $this->Resource_model->has_children($rows,$row['id']);
            if ($hasChildren->check) {
                if (!$leaf) {
                    for($j=0; $j <= ($hasChildren -> rows); $j++) {
                        $parentArray = $workingSet;
                        $childArray = $this -> Resource_model -> build_tree($rows,$row['id']);
                        $workingSet = array_merge($parentArray,array('children' => $childArray -> result));
                    }
                } 
            }
            $result[$i] = $workingSet;
            $i++;
        }
    }

    $response -> result = $result;
    $response -> rows = $i; 
    return $response;
}

これにより、次の JSON が生成されます。

プリントスクリーン

大局

2 つの子 (またはそれ以上? - テスト値なし) を持つすべてのアイテムは、本来あるべき最初のアイテムを取得しますが、2 番目のアイテムには最初のアイテムも含まれているため、すべての結果が複製されます。

どんな助けでも感謝します。

4

2 に答える 2

1

array_merge使用する代わりに-これは、既存のものとマージしようとする代わりに、サブ配列array_pushを追加します...children

コードのこの部分にあります(すでに編集済み):

        $hasChildren = $this->Resource_model->has_children($rows,$row['id']);
        if ($hasChildren->check) {
            if (!$leaf) {
                for($j=0; $j <= ($hasChildren->rows); $j++) {
                    $parentArray = $workingSet;
                    $childArray = $this->Resource_model->build_tree($rows,$row['id']);
                    $workingSet = array_push($parentArray,array('children' => $childArray->result));
                }
            } 
        }
于 2012-06-18T08:28:29.663 に答える
0

うまくいきました。最終的なコードは次のとおりです。

private function build_tree($rows,$parent) {
    $i = 0;
    $response -> result = array();
    $result = array();
    $leaf = false;
    $newArray = array();

    foreach($rows as $row) {
        if($row['parent_id'] == $parent) {
            $leaf = is_null($row['treeDef']) ? false : true;
            $newArray = array(              
                'id' => (int)$i, 
                'parent_id' => (int)$row['parent_id'], 
                'child_id' => (int)$row['id'], 
                'name' => (string)$row['resourceName'], 
                'updated' => strtotime($row['updated']), 
                'purchasedUnit' => (string)$row['purchasingUnit'], 
                'purchasedCost' => (double)$row['purchasingCosts'], 
                'purchasedDiscount' => (double)$row['discount'], 
                'estimateUnit' => (string)$row['estimatingUnit'], 
                'profitAddOn' => (string)$row['profitAddOn'], 
                'landedCost' => (double)$row['landedCost'], 
                'unitCorrelation' => (double)$row['unitCorrelation'], 
                'leadTime' => (string)$row['leadTime'], 
                'ResourceClassShortname' => (string)$row['ResourceClassShortname'], 
                'supplierName' => (string)$row['nameSupplier'],
                'iconCls' => (string)$row['typeIcon'],
                'leaf' => $leaf
            );

            $hasChildren = $this -> Resource_model -> has_children($rows,$row['id']);
            if ($hasChildren->check) {
                for($j=0; $j <= ($hasChildren -> rows); $j++) {
                    $childArray = $this -> Resource_model -> build_tree($rows,$row['id']);
                    $newArray = array_merge($newArray, array('children' => $childArray -> result));
                }
            }
            $result[$i] = $newArray;
            $i++;
        }
    }

    $response -> result = $result;
    $response -> rows = $i; 
    return $response;
}
于 2012-06-18T09:17:13.027 に答える