0

私はSOで質問と回答のコレクションを閲覧してきましたが、質問に対する正しい解決策を見つけることができません.この質問はプログラミングの回答を直接意味するものではありません.ソースコードに..モッズがこの質問に建設的ではないというフラグを立てた場合に備えて..とにかく、それは私だけです...

私はjsonを利用して他のデータベースからのデータをインターフェースするアプリケーションを持っています。私はPHP + MySQLを使用し、インターフェースされたファイルの内容を解析しています。配列の配列の配列を取得します。以下を参照してください。

{
"p_head": [
    {
        "GROUP_ID": "700",
        "GROUP_DESC": "BBREAKFAST",
        "children": {
            "p_item": [
                {
                    "GROUP_ID": "200",
                    "PROD_ID": "113"
                }
            ]
        }
    },
    {
        "GROUP_ID": "601",
        "GROUP_DESC": "AXPRESSO",
        "children": {
            "p_item": [
                {
                    "GROUP_ID": "200",
                    "PROD_ID": "113"
                }
            ]
        }
    }
]
}

現在、前述の JSON データを解析している間、5 つの foreach ループを使用しています。

1 to get the file contents,
1 to get the categories, store categories in array, store children in array
1 to expand the children array
1 to get to another level
1 to get to the array child

その後、再び foreach を使用してカテゴリをループ処理し、データベースへの挿入を開始します。次に、別の foreach ループを使用して項目を反復処理し、各行をデータベースに格納します。

ここで少し質問があります。この解決策は読みやすさのためだけですか? あたかも私がコンパイラであるかのようにコーディングしているように見えます.1行ごとに実行しています.効率の面では?欠点、処理能力の無駄?foreach の使用を減らす必要がありますか、そうであれば、どのように実装できますか。以下は foreach ループのサンプルです...

foreach($json_array as $key=>$value)
{
//echo "The Value: " .$value;
$arr = $value;
//print_r($arr);
//Category Expanding
foreach($arr as $key=>$value)
{
    //echo "Key: ".$key."=>Value: ".$value."<br/>";
    //Category
    $category[] = array(
        'cat_prodcat_posid'=>$value['GROUP_ID'],
        'cat_description'=>$value['GROUP_DESC'],
        'cat_hierarchy'=>$value['POSITION_ID']
    );
    //Category Items
    $items[] = array(
        'item_grp'=>$value['GROUP_ID'],
        'item_arr'=>$value['children']
    );
    $categoryCount++;
}
//Items Expanding
foreach($items as $key=>$value)
{
    $v = $value['item_arr'];
    //print_r($v);
    foreach($v as $key=>$value)
    {
        $v2 = $value;
        //print_r($v2);
        foreach($v2 as $key=>$value)
        {
            //$v3 = $value;
            $item_expanded[] = array(
                'item_posid'=>$value['PROD_ID'],
                'item_poscode'=>$value['PROD_CODE'],
                'item_description'=>$value['PROD_DESC'],
                'item_prodcat_posid'=>$value['GROUP_ID'],
                'item_price'=>$value['PROD_PRICE']
            );
            $itemCount++;
        }
    }
}
}

とにかく、アイテムに特別にショートカットをカットできるものはありますか...そのために3つの foreach を使用しました...または、このソリューションはすでに最高ですか?

4

1 に答える 1

1

foreachループを作成するときは、ループする配列に直接移動することで、ループを減らすことができます。

foreach ($json_array['p_head'] as $key => $val) {
    if ($key != 'children') {
        //do whatever with non-children
    } else {
        foreach ($key['p_item'] as $key2 => $val2) {
            //here is where your p_item info is
        }
    }
}

私の答えが正解である場合は、そのようにマークしてください。ありがとう

于 2012-08-31T09:05:28.797 に答える