Создать и заполнить ассоциативный массив из нескольких измерений - PullRequest
0 голосов
/ 13 июня 2019

В настоящее время я пытаюсь создать ассоциативный массив, который будет иметь два измерения, и я думаю, что решение этой проблемы может решить проблемы для массива с большим количеством измерений.

Я восстанавливаю данные с помощью API, который выглядит какчто:

   {
        "item_id": "89",
        "name": "Confiture de Myrtilles",
        "product_id": "737",
        "meta_key": "vmm_warehouse_sg_10783",
        "meta_value": "0"
    },
    {
        "item_id": "89",
        "name": "Confiture de Myrtilles",
        "product_id": "737",
        "meta_key": "vmm_warehouse_sg_10782",
        "meta_value": "0"
    },

    {
        "item_id": "91",
        "name": "Poires Guyot (bio)",
        "product_id": "690",
        "meta_key": "_backorders",
        "meta_value": "no"
    },
    {
        "item_id": "91",
        "name": "Poires Guyot (bio)",
        "product_id": "690",
        "meta_key": "_sold_individually",
        "meta_value": "no"
    },

Я просто хочу создать массив следующим образом:

            array[item_id->[meta_key->meta_value]]

Так что мне нужно восстановить item_id, который будет выполнять роль второго массива и после того, как положить вс этим массивом связаны meta_key и meta_value.

Так, например, у меня будет такой массив:

Products [89] ["vmm_warehouse_sg_10783" -> "0" "vmm_warehouse_sg_10782" -> "0 "]

И другие, подобные этому:

Продукты [91] [........]

В конце у меня будет финалмассив такой:

Products [ [89]->{"vmm_warehouse_sg_10783"->"0","vmm_warehouse_sg_10782"->"0"}
           [91]->{.....}]

Я уже что-то пробовал, но я только начинающий, и я не нашел решения для своей проблемы.

$Products = $this->wpdb->get_results( $SQL_Deliveries );
//this line allow $Products to recover all data from the API


foreach ( $Products as $Product ) {
    $Meta_products[] = Product->item_id;
    foreach($Product as $Product_meta){
    $Meta_products[$item_id]->{Product_meta->meta_key,Product_meta
        ->meta_value);
    }

Я уверен, что яВ моем коде тоже были изменения, но я действительно не знаю, как решить эту проблему.Спасибо за ваше участие!

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Похоже, вы хотите многомерный массив объектов.

Для объявления вложенных объектов нужно немного поиграть. Кудрявая связь также необходима.

Код: ( Демо )

$products = [
    (object)["item_id"    => "89",
     "name"       => "Confiture de Myrtilles",
     "product_id" => "737",
     "meta_key"   => "vmm_warehouse_sg_10783",
     "meta_value" => "0"
    ],
    (object)["item_id"    => "89",
     "name"       => "Confiture de Myrtilles",
     "product_id" => "737",
     "meta_key"   => "vmm_warehouse_sg_10782",
     "meta_value" => "0"
    ]
];
    $result = (object)[];
    foreach($products as $product) {
        if (!isset($result->{$product->item_id})) {
            $result->{$product->item_id} = (object)[];
        }
        $result->{$product->item_id}->{$product->meta_key} = $product->meta_value; 
    }

var_export($result);

Выход:

(object) array(
   '89' => 
  (object) array(
     'vmm_warehouse_sg_10783' => '0',
     'vmm_warehouse_sg_10782' => '0',
  ),
)

В качестве альтернативы, для создания структуры вложенных объектов, вы можете построить массив массивов, затем использовать json_encode(), затем json_decode() в результате.


Если вы хотите получить массив в качестве вывода, это проще всего: Код: ( Демо )

$products = [
    (object)["item_id"    => "89",
     "name"       => "Confiture de Myrtilles",
     "product_id" => "737",
     "meta_key"   => "vmm_warehouse_sg_10783",
     "meta_value" => "0"
    ],
    (object)["item_id"    => "89",
     "name"       => "Confiture de Myrtilles",
     "product_id" => "737",
     "meta_key"   => "vmm_warehouse_sg_10782",
     "meta_value" => "0"
    ],
    (object)["item_id"    => "91",
     "name"       => "Poires Guyot (bio)",
     "product_id" => "690",
     "meta_key"   => "_backorders",
     "meta_value" => "no"
    ],
    (object)["item_id"    => "91",
     "name"       => "Poires Guyot (bio)",
     "product_id" => "690",
     "meta_key"   => "_sold_individually",
     "meta_value" => "no"
    ]
];

$result = [];
foreach($products as $product) {
    $result[$product->item_id][$product->meta_key] = $product->meta_value; 
}

var_export($result);

Выход:

array (
  89 => 
  array (
    'vmm_warehouse_sg_10783' => '0',
    'vmm_warehouse_sg_10782' => '0',
  ),
  91 => 
  array (
    '_backorders' => 'no',
    '_sold_individually' => 'no',
  ),
)
0 голосов
/ 13 июня 2019

Я не совсем понимаю, чего вы пытаетесь достичь, но я полагаю, вы хотите ассоциативный массив с id в качестве ключа и массив meta_key и meta_value в качестве его значения?

Если это так, то:

foreach ( $Products as $Product ) {
    $Meta_products[$Product->item_id][$Product->meta_key] = $Product->meta_value;
}
...