Принудительно добавить массив в один элемент JSON в PHP - PullRequest
0 голосов
/ 08 июня 2019

Я настраиваю плагин WordPress для экспорта файла JSON для стороннего использования.

Мне нужно добавить массив в "order_item", где он содержит только один элемент.Для элементов с несколькими порядками автоматически добавляется массив (квадратные скобки).

Я пытаюсь разными способами включить массив в $ child-> addChild ('order_item'), например (массив) $ child->addChild ('order_item'), но это должен быть неправильный метод.

функция для генерации вывода json выглядит следующим образом:

function woo_ce_export_dataset_override_order( $output = null ) {

    global $export;

    if( !empty( $export->fields ) ) {
        $child = $output->addChild( 'transaction_date', date("Ymd", time()) );
        foreach( $orders as $order ) {

            $child = $output->addChild( apply_filters( 'woo_ce_export_xml_order_node', 'neworders' ) );

            $args = $export->args;
            $order = woo_ce_get_order_data( $order, 'order', $args, array_keys( $export->fields ) );

            foreach( array_keys( $export->fields ) as $key => $field ) {
                if( isset( $order->$field ) && isset( $export->columns[$key] ) ) {
                    if( !is_array( $field ) ) {
                        $child->addChild( apply_filters( 'woo_ce_export_xml_order_label', sanitize_key( $export->columns[$key] ), $export->columns[$key] ), esc_html( woo_ce_sanitize_xml_string( $order->$field ) ) );
                    }
                }
            }

            if( !empty( $order->order_items ) ) {
                foreach( $order->order_items as $order_item ) {
                    $order_item_child = $child->addChild( 'order_item' );

                    foreach( array_keys( $export->fields ) as $key => $field ) {
                        if( isset( $order_item->$field ) && isset( $export->columns[$key] ) ) {
                            if( !is_array( $field ) ) {
                                $order_item_child->addChild( apply_filters( 'woo_ce_export_xml_order_label', sanitize_key( $export->columns[$key] ), $export->columns[$key] ), esc_html( woo_ce_sanitize_xml_string( $order_item->$field ) ) );
                            }
                        }
                    }
                }
            }
        }
        // Allow Plugin/Theme authors to add support for sorting Orders
        $output = apply_filters( 'woo_ce_orders_output', $output, $orders );
    }
    return $output;
}   

Это то, что я получаю из вывода:

{
    "transaction_date": "20190607",
    "neworders": [
        {
            "postid": "12081",
            "order_item": [
                {
                    "ugs": "SAM1222",
                    "qty": "3"
                },
                {
                    "ugs": "NOK8777",
                    "qty": "3"
                }
            ]
        },
        {
            "postid": "12082",
            "order_item": {
                "ugs": "SON7411",
                "qty": "1"
            }
        }
    ]
}

Что я ожидал включить массив в order_item для postid: 12082

{
    "transaction_date": "20190607",
    "neworders": [
        {
            "postid": "12081",
            "order_item": [
                {
                    "ugs": "SAM1222",
                    "qty": "3"
                },
                {
                    "ugs": "NOK8777",
                    "qty": "3"
                }
            ]
        },
        {
            "postid": "12082",
            "order_item": [
                {
                    "ugs": "SON7411",
                    "qty": "1"
                }
            ]
        }
    ]
}

1 Ответ

0 голосов
/ 08 июня 2019

Похоже, вы генерируете XML (используя SimpleXML), а не JSON.Я предполагаю, что вы используете json_encode () для компиляции вывода отладки / vardump объекта SimpleXML в JSON.

На данный момент SimpleXML может не знать, что у одного элемента могут быть одноуровневые элементы.

Я предлагаю вам сгенерировать структуру для JSON напрямую.Это просто с PHP.Вот сокращенный пример (без выборки данных и фильтра):

// simplified demo data
$orders = [
  '12081' => [
      'SAM1222' => 3,
      'NOK8777' => 3
  ], 
  '12082' => [
      'SON7411' => 1
  ]   
];

// associative arrays get encoded as objects in JSON
$result = [
  "transaction_date" => date('Ymd'),
  "neworders" => []    
];
foreach($orders as $orderId => $order) {
   $post = [
      'postid' => $orderId,
      'order_item' => []
   ];
   foreach ($order as $itemId => $quantity) {
       // numerical arrays will be encoded as arrays in JSON
       $post['order_item'][] = [
           "ugs" => $itemId,
           "qty" => $quantity
       ];
   }
   $result['neworders'][] = $post;
}
echo json_encode($result, JSON_PRETTY_PRINT);

Вывод:

{ 
  "transaction_date": "20190608", 
  "neworders": [ 
    { 
      "postid": 12081, 
      "order_item": [ 
        { 
          "ugs": "SAM1222", 
          "qty": 3 
        }, 
        {
          "ugs": "NOK8777",
          "qty": 3 
        } 
      ] 
    }, 
    { 
      "postid": 12082, 
      "order_item": [ 
        { 
          "ugs": "SON7411",
          "qty": 1 
        } 
      ] 
    } 
  ] 
}
...