【问题标题】:Force to add array into single element of JSON in PHP强制在 PHP 中将数组添加到 JSON 的单个元素中
【发布时间】:2019-06-08 06:53:28
【问题描述】:

我正在自定义一个 WordPress 插件以导出 JSON 文件以供第 3 方使用。

我需要将一个数组添加到“order_item”,它只包含一个项目。对于多个订单项目,自动添加数组(方括号)。

我尝试了不同的方法来将数组包含到 $child->addChild('order_item') 中,例如 (array)$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"
                }
            ]
        }
    ]
}

【问题讨论】:

    标签: php arrays json xml


    【解决方案1】:

    看起来您正在生成 XML(使用 SimpleXML)而不是 JSON。我想您使用 json_encode() 将 SimpleXML 对象的调试/vardump 输出编译为 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 
            } 
          ] 
        } 
      ] 
    }
    

    【讨论】:

    • 您好,您的解决方案适用于演示数据,您为我解决问题提供了一些想法。但是我需要使用现有的功能来处理你的想法,所以我在这里创建了另一个帖子stackoverflow.com/questions/56514045/…希望你能提供帮助,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2015-06-12
    相关资源
    最近更新 更多