web-dev-qa-db-ja.com

$ wpdbによって返されるデータの構造を変更する

$ wpdbを介してSQLによって出力された多次元配列の構造を変更する

$wpdbから必要な出力は、foreach内で複数のクエリを実行することで簡単に達成できます。ただし、パフォーマンスの問題ではこれを回避しようとしています。

カスタムテーブルが2つあります。

items
- item_id
- item_name

sub_items
- sub_item_id
- item_id
- sub_item_name

私が実行しているクエリ:

$items_tbl = $wpdb->prefix . 'items';
$sub_items_tbl = $wpdb->prefix . 'sub_items';
$results = $wpdb->get_results($wpdb->prepare("SELECT * from $sub_items_tbl LEFT JOIN $items_tbl ON $items_tbl.item_id = $sub_items_tbl.item_id"), ARRAY_A);

これは上記のクエリの結果の出力です。

array(
    [0] => array(
        ['sub_item_id'] => 1
        ['item_id'] => 1
        ['sub_item_name'] => 'Lorem Ipsum'
        ['item_name'] => Some Item Name
    )
    [1] => array(
        ['sub_item_id'] => 2
        ['item_id'] => 1
        ['sub_item_name'] => 'Lorem Ipsum Ornare Parturient'
        ['item_name'] => Some Item Name
    )
    [2] => array(
        ['sub_item_id'] => 3
        ['item_id'] => 2
        ['sub_item_name'] => 'Lorem Ipsum Adipiscing Malesuada'
        ['item_name'] => Some Item Name
    )
    [3] => array(
        ['sub_item_id'] => 4
        ['item_id'] => 2
        ['sub_item_name'] => 'Lorem Ipsum Ligula'
        ['item_name'] => Some Item Name
    )
    [4] => array(
        ['sub_item_id'] => 5
        ['item_id'] => 2
        ['sub_item_name'] => 'Lorem Ipsum Sit Adipiscing'
        ['item_name'] => Some Item Name
    )
)

そしてこれは私が必要とする出力です:

array(
    [0] => array(
        ['item_id'] => 1
        ['item_name'] => Some Item Name
        ['sub_items'] =>[0] => array(
                            ['sub_item_id'] => 1
                            ['sub_item_name'] => 'Lorem Ipsum'
                        )
                        [1] => array(
                            ['sub_item_id'] => 2
                            ['sub_item_name'] => 'Lorem Ipsum Ornare Parturient'
                        )
    )
    [1] => array(
        ['item_id'] => 2
        ['item_name'] => Some Item Name
        ['sub_items'] =>[0] => array(
                            ['sub_item_id'] => 3
                            ['sub_item_name'] => 'Lorem Ipsum Adipiscing Malesuada'
                        )
                        [1] => array(
                            ['sub_item_id'] => 4
                            ['sub_item_name'] => 'Lorem Ipsum Ligula'
                        )
                        [2] => array(
                            ['sub_item_id'] => 5
                            ['sub_item_name'] => 'Lorem Ipsum Sit Adipiscing'
                        )
    )
)

私はできれば結果の出力を得るためにSQLを修正したいと思います。しかし、それが実現できない場合は、PHPでどのように出力を変更できますか?

1
John

私が見ることができる限り、あなたは2つの方法のうちの1つをこれをすることができます:

  1. 現在の結果と必要な結果を組み合わせるには、PHPを使用します。基本的に:

    $ records = array();

    foreach( $results as $result )
    {
        $record_id = $result['item_id'];
        if (empty($records[$record_id])) {
            $records[$record_id]['item_id'] = $result['item_id'];
            $records[$record_id]['item_name'] = $result['item_name'];
            $records[$record_id]['sub_items'] = array();
        }
        $records[$record_id]['sub_items'][] = array( 
           'sub_item_id' => $result['sub_item_id'],
           'sub_item_name' => $result['sub_item_name']  
        );
    }
    
  2. 他の方法は2つの問い合わせをすることです。最初のものは主なアイテムを見つけます。あなたがメインアイテムのアイテムIDを持っているなら、あなたはitem_idがあなたが以前にクエリしたものの中にあるすべてのサブアイテムを取得する二次クエリを行います。次に、最初のオプションと同様に、PHPを使用して入れ子にした配列にまとめます。

私が言うことができる限り、あなたは実際にあなたが望むようにあなたがmySQLで入れ子にされた結果をすることができないので、あなたはPHPでlegworkをする必要があるでしょう。

2
Manny Fleurmond