我有一个存储帐户和订阅的数据库。帐户可以包含帐户和订阅,并且具有三个以上的父级别。
数据库查询结果中的一行如下所示:
$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 :(得分: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之类的东西。