Как я могу построить многомерный массив из возврата запроса wpdb? - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь построить многомерный массив из возврата запроса и столкнулся с проблемой. Вот дезинфицированный фрагмент, похожий на то, что я пытаюсь сделать. Моя проблема заключается в создании подмассива. Любые предложения, чтобы получить желаемый результат? Я использовал JSON, так что это было бы более очевидно. Я могу разобрать массив или JSON.

<?php
// this is my query

global $wpdb;
        $locationData = $wpdb->get_results("SELECT
        locations.locationID,
        locations.location_name,
        locations.city,
        locations.state,
        locations.products,
        locations.type,
        locations.sku
");

// which returns something like

// [locationID] [location_name] [city] [state] [products] [type]      [sku]
//  001          Tulsa Outlet    Tulsa   OK    cakes      chocolate   3763
//  001          Tulsa Outlet    Tulsa   OK    cakes      lemon       3765
//  001          Tulsa Outlet    Tulsa   OK    sodas      coke        4983
//  001          Tulsa Outlet    Tulsa   OK    sodas      sprite      4950
//  and so on..

// I build an array to be consumed by another function that I created in my plugin:

foreach( $locationData as $key => $location ) {
        $output[$row['locationID']] = array(
            'locationID' => $row['locationID'],
            'location_name' => $row['location_name'],
            'products' => array(
                // this is where my previous attempts broke down
            )
        );
        $output[$key]['city'] = $location->city;
        $output[$key]['state'] = $location->state;
        }

// and the $output I need would look like this:

{
    "locations" : [
        {
            "locationID" : "001",
            "location_name" : "Tulsa Outlet",
            "products" : {
                "cakes" : {
                    "chocolate" : "3763",
                    "lemon" : "3765"
                },
                "sodas" : {
                    "coke" : "4983",
                    "sprite" : "4950"
                }
            },
            "city" : "Tulsa",
            "state" : "ok"
        }
    ]
}
?>

1 Ответ

1 голос
/ 23 февраля 2020

Это должно помочь:

$output = [];
foreach ($locationData as $location) {
    $locId = $location->locationID;
    if (empty($output[$locId])) {
        $output[$locId] = [
            'locationID' => $location->locationID,
            'location_name' => $location->location_name,
            'city' => $location->city,
            'state' => $location->state,
            'products' => [],
        ];
    }
    $productType = $location->products;
    if (empty($output[$locId]['products'][$productType])) {
        $output[$locId]['products'][$productType] = [];
    }
    $output[$locId]['products'][$productType][$location->type] = $location->sku;
}

Не совсем уверен, что вы используете - $row или $location, поэтому измените все на $location.

Для переиндексации $output для 0-индексного массива используйте array_values.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...