从数据库查询创建多维数组

时间:2012-06-17 11:10:45

标签: php arrays multidimensional-array hierarchy

我有一个存储帐户和订阅的数据库。帐户可以包含帐户和订阅,并且具有三个以上的父级别。

数据库查询结果中的一行如下所示:

$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"]);
}

我现在想到的解决方案是将基本密钥从每次迭代传递到下一次迭代,然后如果例如前一级别高于此级别,则只需使用某种字符串替换来删除最后一级关键的两个部分。

有更好的想法吗?我很确定这是一种做我想要完成的事情的糟糕方式。

3 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分: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"];     
}

答案 2 :(得分:0)

我很感激答案,但我认为问题在于我的数据库查询应该包含帐户所有父项的记录,而不仅仅是父项,使用Oracle SQL中的SYS_CONNECT_BY_PATH之类的东西。