2012-06-17 2 views
0

У меня есть база данных, в которой хранятся учетные записи и подписки. Учетная запись может содержать учетные записи и подписки и иметь более трех родительских уровней.Создать многомерный массив из запроса базы данных

Строка из результата запроса базы данных выглядит так:

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

(Уровень 1 означает, что верхний уровень, и он будет иметь PARENTACCOUNTNO = нуль).

Из этого я пытаюсь создать многомерный массив, который выглядит примерно так:

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

I оцените ответы, но я думаю, что проблема заключается в моем запросе базы данных, который должен содержать записи обо всех родителях учетной записи, а не только родителя, используя что-то вроде SYS_CONNECT_BY_PATH в Oracle SQL.

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

Каждая строка - это учетная запись и подписка с необязательной ссылкой на родительскую учетную запись. Это означает, что любая строка может быть родительской или родительской для родительской учетной записи или родителем родительской учетной записи и т. Д. –