2015-07-28 48 views
1

我一直在將平面數組轉換爲多維樹狀。 I have already done it, but I used references, which creates another set of problems down the line,所以我需要做這個沒有參考。如何在不使用引用的情況下從平面數組生成樹狀數組

輸入數組:

Array 
[ 
1 =>[ 
     'content_id' => 1, 
     'sort_order' => 1, 
     'level' => 1 
    ], 
2 =>[ 
     'content_id' => 7, 
     'sort_order' => 2, 
     'level' => 2 
    ], 
3 =>[ 
     'content_id' => 4, 
     'sort_order' => 3, 
     'level' => 2 
    ], 
4 =>[ 
     'content_id' => 2, 
     'sort_order' => 4, 
     'level' => 3 
    ], 
5 =>[ 
     'content_id' => 3, 
     'sort_order' => 5, 
     'level' => 1 
    ], 
6 =>[ 
     'content_id' => 6, 
     'sort_order' => 6, 
     'level' => 1 
    ], 
7 =>[ 
     'content_id' => 5, 
     'sort_order' => 7, 
     'level' => 2 
    ] 
] 

輸出數組:

1 => [ 
    'id' = 1, 
    'visited' = 0, 
    'children' => [ 
      2 => [ 
        'id' => 7, 
        'visited' => 0, 
        'children' => [] 
      ], 
      3 => [ 
        'id' => 4, 
        'visited' => 0, 
        'children' => [ 
          4 => [ 
           'id' = 2, 
           'visited' = 0, 
           'children' => [] 
          ] 
      ] 
], 
5 => [ 
    'id' => 3, 
    'visited' => 0, 
    'children' => [] 
], 
6 => [ 
    'id' => 6, 
    'visited' => 0, 
    'children' => [ 
      7 => [ 
        'id' => 5, 
        'visited' => 0, 
        'children => [] 
      ] 
] 
] 

任何想法如何解決這樣的問題,而不必直接母公司的關係設置?我可以使用遞歸,但引用是問題。

+1

你有2個相同的問題。刪除其中之一 – splash58

+0

我沒有看到沒有參考問題的建築樹狀陣列與修復已使用參考文獻問題的書面材料之間的相互關係。 – SubjectX

+0

您的數組對我沒有任何意義。你能否在你的示例代碼中嘗試使用有效的PHP語法? – Sherif

回答

1

哦,這種問題的確令我感到癢。所以,這裏是我的解決方案:

<?php 

$origArray = array(
    array('content_id' => 1, 'sort_order' => 1, 'level' => 1), 
    array('content_id' => 7, 'sort_order' => 2, 'level' => 2), 
    array('content_id' => 4, 'sort_order' => 3, 'level' => 2), 
    array('content_id' => 2, 'sort_order' => 4, 'level' => 3), 
    array('content_id' => 3, 'sort_order' => 5, 'level' => 1), 
    array('content_id' => 6, 'sort_order' => 6, 'level' => 1), 
    array('content_id' => 5, 'sort_order' => 7, 'level' => 2), 
); 

function sortByOrder($a, $b) { 
    if ($a['sort_order'] == $b['sort_order']) { 
     return 0; 
    } 
    return ($a['sort_order'] < $b['sort_order']) ? -1 : 1; 
} 

function createHierarchicalArray($arr) { 
    $result = array(); 
    foreach ($arr as $el) { 
     $result = insertArrayElement($result, $el['content_id'], $el['level']); 
    } 
    return $result; 
} 

function insertArrayElement($array, $id, $level, $currentLevel = 1) { 
    if ($level > $currentLevel) { 
     $ids = array_keys($array); 
     $currentId = end($ids); 
     if (!isset($array[$currentId]['children'])) { 
      $array[$currentId]['children'] = array(); 
     } 
     $array[$currentId]['children'] = insertArrayElement($array[$currentId]['children'], $id, $level, $currentLevel + 1); 
    } else { 
     $array[$id] = array(); 
    } 

    return $array; 
} 

// Could do without this, if the array is already sorted. Otherwise it's a necessary step. 
uasort($origArray, 'sortByOrder'); 

$result = createHierarchicalArray($origArray); 

var_dump($result); 

編輯:更改了代碼以合併問題中的更改。

+0

對不起,如果我改變了一些給你提出問題的東西,希望只有視覺表現能夠隨着我的編輯而改變。 – SubjectX

+0

漂亮的工作人,真快!有沒有辦法將原始元素中的其他數據放入新數組中?我的意思是,我可能會將原始數組中的元素ID傳遞給遞歸函數,然後從原始數組中複製原始數組中的元素到$ array ['$ id] = array()行中。有沒有更好/更安全的方法? – SubjectX

+0

$ currentKey可能應該是$ currentId。另外,我們如何擺脫通知:「只有變量應該通過引用傳遞」? – SubjectX

相關問題