0

アカウントとサブスクリプションを格納するデータベースがあります。アカウントには、アカウントとサブスクリプションを含めることができ、3 つ以上の親レベルを持つことができます。

データベース クエリの結果の行は次のようになります。

$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

これは私がこれまでに持っているコードで、最初の 2 つのレベルで非常にうまく機能します。3 つ以上のレベルがある場合、各アカウントは自分の親しか知らないため、事態はさらに複雑になります。

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

私が今考えている解決策は、各反復から次の反復に基本キーを渡すことです。たとえば、前のレベルがこのレベルの 2 レベル上にある場合は、ある種の文字列置換を使用して、最後の 2 つの部分を削除します。キー。

より良いアイデアはありますか?これは、私が達成しようとしていることを行うためのくだらない方法だと確信しています。

4

3 に答える 3

0

答えに感謝しますが、問題は、Oracle SQL の SYS_CONNECT_BY_PATH のようなものを使用して、親だけでなく、アカウントのすべての親のレコードを含む必要があるデータベース クエリだと思います。

于 2012-06-17T15:52:29.870 に答える
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;
    }
}
于 2012-06-17T11:48:27.287 に答える
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"];     
}
于 2012-06-17T11:52:24.597 に答える