2012-06-17 96 views
0

我有一個存儲帳戶和訂閱的數據庫。一個帳戶可以包含帳戶和訂閱,並且擁有三個以上的父級別。從數據庫查詢創建多維數組

從數據庫查詢結果的行看起來是這樣的:

$array = (0 => array("level" => "2", "accountno" => "123124234", "accountname" => "Hansel", "parentaccountno" => "000213123", "subscription" => "5423213213", "username" => "Gretchen"); 

(1級意味着它是頂級水平,這將有PARENTACCOUNTNO = NULL)。

從這個我想創建一個多維數組這看起來是這樣的:

accounts: 
    000213123 
     accounts: 
      123124234 
       name: Hansel 
       subscriptions: 
        5423213213 
         username: Gretchen 

這是我的代碼到目前爲止,它的作品真的很好的前兩個級別。當有三個層次或更多的事情變得更加複雜,因爲只有知道自己的父母每個帳戶:

$hierarchy = array(); 

foreach ($decode as $row) { 
    $accountno = $row["ACCOUNTNO"]; 
    $msisdn = $row["MSISDN"]; 
    if ($row["PARENTACCOUNTNO"] == null) 
     $base_array_key = $hierarchy["accounts"]; 

    $base_array_key[$accountno] = array("name" => $row["ACCOUNTNAME"], "accounts" => array(), "subscriptions" => array()); 

    $hierarchy["accounts"][$accountno]["accounts"]["321323123213"] = "blaha"; 

    if ($row["MSISDN"] != null) 
     $hierarchy["accounts"][$accountno]["subscriptions"][$msisdn] = array("enduser" => $row["ENDUSER"]); 
} 

的解決方案,我心目中現在的問題是,從每次迭代的基本密鑰傳遞到下一迭代,然後如果例如以前的級別是高於這個級別的兩個級別,則只需使用某種字符串替換來刪除密鑰的最後兩個部分。

有什麼更好的點子?我很確定這是做我想要完成的事情的一個糟糕的方式。

+0

這是一個「完成我的代碼」問題嗎?或者你在某處遇到錯誤? – Starx

+0

沒有錯誤,只是尋找一些友好的建議,我已經堅持了一個星期,試圖找到*最佳*解決方案。 –

回答

0

我欣賞答案,但我認爲問題是我的數據庫查詢應該包含一個帳戶的所有父母的記錄,而不僅僅是父母,在Oracle SQL中使用類似SYS_CONNECT_BY_PATH的記錄。

0

創建一個臨時的關聯數組:

$all_records = array(); 

與您在數據庫中找到的結果來填充它:

while($result = get_results_from_db()) { 
    $accountno = $result[accountno]; 
    $all_records[$accountno] = $result; 
} 

現在,你必須通過賬戶號碼索引,以便可以很容易地找到任何一個數組記錄你是否知道它是帳號。因此,您可以遍歷數組以將孩子與父母關聯起來:

$top_level_records = array(); 
foreach($all_records AS $record) { 
    $parentaccountno = $record[parentaccountno]; 
    if(!empty($parentaccountno)) { 
     $parent = &$all_records[$record[parentaccountno]]; 
     if(empty($parent['accounts'])) 
      $parent['accounts'] = array() 
     $parent['accounts'][] = $record; 
    } 
    else { 
     $top_level_records[] = $record; 
    } 
} 
0

是否所有的結果都是這樣的?那麼,父母賬戶在哪裏呢?或者我錯過了什麼?我會簡單的重寫查詢,以獲得更「線性」的結果,如:

parentaccountno | accountno | accountname | bla 
----------------------------------------------- 
000213123  | 123124234 | Hansel  | abc 

當每一個結果行看起來是這樣的,你可以簡單的創建最終陣列那樣:

foreach ($decode as $row) { 
    $my_array = [ $row["parentaccountno"] ][ $row["accountno"] ]["accountname"] = $row["accountname"];  
    $my_array = [ $row["parentaccountno"] ][ $row["accountno"] ]["bla"] = $row["bla"];  
} 
+0

每一行都是一個帳戶和一個訂閱,並帶有對父帳戶的可選引用。這意味着任何行都可以是父母帳戶,父母帳戶的父母或父母的母公司的父母等。 –