2015-07-31 2 views
0

Я работаю с WooCommerce API для разработки небольшого веб-приложения. Это приложение должно получить информацию из Wordpress/Woocommerce.php looping через многомерную массив медленно

Я могу тянуть в некоторых из этой информации штрафа, но возникли проблемы с другими битами (Это совершенно другой вопрос.)

Данные образуют WooCommerce REST API возвращается в виде многомерного массива.

Это пример одного заказа:

array (size=2) 
    'order' => 
    array (size=30) 
     'id' => int 22 
     'order_number' => int 22 
     'created_at' => string '2015-07-30T14:01:54Z' (length=20) 
     'updated_at' => string '2015-07-30T14:01:54Z' (length=20) 
     'completed_at' => string '2015-07-30T13:01:54Z' (length=20) 
     'status' => string 'on-hold' (length=7) 
     'currency' => string 'GBP' (length=3) 
     'total' => string '3.84' (length=4) 
     'subtotal' => string '3.84' (length=4) 
     'total_line_items_quantity' => int 2 
     'total_tax' => string '0.00' (length=4) 
     'total_shipping' => string '0.00' (length=4) 
     'cart_tax' => string '0.00' (length=4) 
     'shipping_tax' => string '0.00' (length=4) 
     'total_discount' => string '0.00' (length=4) 
     'shipping_methods' => string '' (length=0) 
     'payment_details' => 
     array (size=3) 
      'method_id' => string 'bacs' (length=4) 
      'method_title' => string 'Direct Bank Transfer' (length=20) 
      'paid' => boolean false 
     'billing_address' => 
     array (size=11) 
      'first_name' => string 'Chris' (length=5) 
      'last_name' => string '#' (length=5) 
      'company' => string '' (length=0) 
      'address_1' => string '#' (length=4) 
      'address_2' => string '' (length=0) 
      'city' => string '#' (length=7) 
      'state' => string '' (length=0) 
      'postcode' => string '#' (length=7) 
      'country' => string 'GB' (length=2) 
      'email' => string '#' (length=20) 
      'phone' => string '#' (length=11) 
     'shipping_address' => 
     array (size=9) 
      'first_name' => string 'Chris' (length=5) 
      'last_name' => string '#' (length=5) 
      'company' => string '' (length=0) 
      'address_1' => string '#' (length=4) 
      'address_2' => string '' (length=0) 
      'city' => string '#' (length=7) 
      'state' => string '' (length=0) 
      'postcode' => string '#' (length=7) 
      'country' => string 'GB' (length=2) 
     'note' => string '' (length=0) 
     'customer_ip' => string '#' (length=15) 
     'customer_user_agent' => string 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H143 Safari/600.1.4' (length=134) 
     'customer_id' => int 1 
     'view_order_url' => string '#' (length=58) 
     'line_items' => 
     array (size=2) 
      0 => 
      array (size=12) 
       ... 
      1 => 
      array (size=12) 
       ... 
     'shipping_lines' => 
     array (size=0) 
      empty 
     'tax_lines' => 
     array (size=0) 
      empty 
     'fee_lines' => 
     array (size=0) 
      empty 
     'coupon_lines' => 
     array (size=0) 
      empty 
     'customer' => 
     array (size=14) 
      'id' => int 1 
      'created_at' => string '2015-07-29T16:12:13Z' (length=20) 
      'email' => string '#' (length=20) 
      'first_name' => string '' (length=0) 
      'last_name' => string '' (length=0) 
      'username' => string '#' (length=6) 
      'role' => string '#' (length=13) 
      'last_order_id' => string '26' (length=2) 
      'last_order_date' => string '2015-07-30T22:22:42Z' (length=20) 
      'orders_count' => int 5 
      'total_spent' => string '7.96' (length=4) 
      'avatar_url' => string '#' (length=34) 
      'billing_address' => 
      array (size=11) 
       ... 
      'shipping_address' => 
      array (size=9) 
       ... 
    'http' => 
    array (size=2) 
     'request' => 
     array (size=7) 
      'headers' => 
      array (size=3) 
       ... 
      'method' => string 'GET' (length=3) 
      'url' => string '#' (length=290) 
      'params' => 
      array (size=5) 
       ... 
      'data' => 
      array (size=0) 
       ... 
      'body' => null 
      'duration' => float 5.01302 
     'response' => 
     array (size=3) 
      'body' => string '{"order":{"id":22,"order_number":22,"created_at":"2015-07-30T14:01:54Z","updated_at":"2015-07-30T14:01:54Z","completed_at":"2015-07-30T13:01:54Z","status":"on-hold","currency":"GBP","total":"3.84","subtotal":"3.84","total_line_items_quantity":2,"total_tax":"0.00","total_shipping":"0.00","cart_tax":"0.00","shipping_tax":"0.00","total_discount":"0.00","shipping_methods":"","payment_details":{"method_id":"bacs","method_title":"Direct Bank Transfer","paid":false},"billing_address":{"first_name":"Chris","last_na'... (length=2349) 
      'code' => int 200 
      'headers' => 
      array (size=5) 
       ... 

Anywhere с хэш-я просто удалить данные из соображений безопасности.

Таким образом, мне нужно выполнить все заказы на выходную информацию. Я могу легко получить доступ к строк в главном «порядка» массива с помощью этого цикла:

$orders = $connect->orders->get(22); 

      foreach($orders as $order) { 
       foreach($order as $value) { 


        echo $value["order_number"]; 
        $value["total"]; 

       } 
      } 

Этот цикл выполняется и выводит данные в считанные секунды.

Однако, когда я пришел к выводу данных из массива-х line_items "в пределах основного массива заказа:

1) Я не могу показаться, чтобы сделать это без указания идентификатора заказа в противном случае я получаю Undefined индекса: порядок и недопустимый аргумент для строки позиций foreach.

преодолеть, что я добавил эту строку в основной цикл, чтобы получить данные формируют массив «line_items»:

$line_items = $connect->orders->get($value["order_number"]); 

         $line_items = $orders['order']['line_items']; 

Затем я запустить Еогеасп над этим для вывода значения образуют «line_items массив»

foreach($line_items as $item) { 
       echo $item['name']; 
       echo $item['quantity']'; 

      } 

так что это работает, но выводя «line_items» таким образом делает загрузку страницы невероятно медленной. он занимает около 40 секунд, чтобы пройти через 6 порядков.

, где, как и без этой линии:

$line_items = $connect->orders->get($value["order_number"]); 

страница делает приблизительно через 5 секунд.

Мой вопрос: s это лучший способ получить доступ к массиву 'line_items'?

Ниже приведен полный код, выводящий информацию о заказе, включая позиции.

$orders = $connect->orders->get(22); 

      foreach($orders as $order) { 
       foreach($order as $value) { 


        echo $value["order_number"]; 
        $value["total"]; 

        //get line items based on current order id - this is the slow bit! 
        $line_items = $connect->orders->get($value["order_number"]); 
        $line_items = $orders['order']['line_items']; 

        //loop through line items 
        foreach($line_items as $item) { 
         echo $item['name']; 
         echo $item['quantity']'; 

        } 

       } 
      } 
+0

Сколько данных выводится на страницу? 2K или 40M байт? – wallyk

+0

Теперь это будет звучать глупо. Как я могу точно сказать, сколько данных выводится? – chinds

+0

Один из способов - просмотреть источник веб-страницы (ctrl-U в браузерах семейства Mozilla), скопировать и вставить его в редактор, а затем сохранить его и посмотреть размер файла. – wallyk

ответ

0

Проблема заключается в том, что ваш массив верхнего уровня состоит из двух элементов, http и order, и секция http НЕ имеет order_number в нем.

Так в основном вы делаете

echo $array['order']['order_number']; // works 
echo $array['http']['order_number']; // doesn't work. 

Вы, вероятно, хотите одну петлю:

foreach($orders['order'] as $order) 
    echo $order['order_number']; 
} 
+0

, как я понимаю вас, тогда моя петля должна выглядеть так: [ код] $ orders = $ connect-> orders-> get(); Foreach ($ заказы [ «заказ»] в $ порядке) { } [код] Проблема то в том, что я получаю неопределенную ошибку индекса заказа, если я не указать номер заказа в методе GET – chinds

+0

то сделать 'var_dump ($ orders)', чтобы увидеть, что вы действительно получили. –

+0

, который возвращает тот же массив, что и в моем вопросе. Если я не укажу номер заказа в методе get, тогда вызов array lik $ orders ['order'] возвращает неопределенную ошибку индекса – chinds

Смежные вопросы