【问题标题】:Create multidimensional array from database query从数据库查询创建多维数组
【发布时间】:2012-06-17 11:10:44
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 这是complete my code 的问题吗?还是你在某个地方出错了?
  • 没有错误,只是在寻找一些友好的建议,我已经坚持了大约一周,试图找到最佳解决方案。

标签: php arrays multidimensional-array hierarchy


【解决方案1】:

你所有的结果都是这样的吗?那么,父帐户在哪里?还是我错过了什么?我会简单地重写查询以获得更“线性”的结果,例如:

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】:

创建一个临时关联数组:

$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;
    }
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多