【问题标题】:SimpleXML data processingSimpleXML 数据处理
【发布时间】:2011-08-31 13:57:30
【问题描述】:

我即将完成一个使用 simplexml 处理一些数据的脚本,但我被困在了最后。

嗯,不是卡住,而是好奇和卡住。

$tmp 包含我的 XML(大约 750k),目标是将其转换为 fputcsv 格式(父数组,每行包含一个数组)。

下面的工作,但是我可以使用 fputcsv 并将其发送回用户的漂亮干净的数组有很多开销,我不需要写入 CSV 文件,这无疑会给我带来问题fputcsv。我已经将输出清理成几个标题列和几行,但实际上有 20 列和数百行。无论如何要在 fputcsv 之前清理?

        // Process XML response into arrays for fputcsv
        $csv = array();
        $xml = simplexml_load_string($tmp);

        // Create array and loop each column for header row
        $header_row = array();
        foreach ($xml->RESPONSE->DATA->HEADER->COLUMN as $column) {
            $header_row[] = $column;
        }
        $csv[] = $header_row;

        // Create array and loop each column for header row

        foreach ($xml->RESPONSE->DATA->ROW as $row) {
            $data_row = array();
            foreach ($row->COLUMN as $datacolvalue){
                $data_row[] = $datacolvalue;
            }
            $csv[] = $data_row;
            unset($data_row);
        }

        // Output var to check for accuracy (later add fputcsv)
        var_dump($csv);

输出(print_r - 如果需要,可以 var_dump):

Array
(
    [0] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [0] => date
                )

            [1] => SimpleXMLElement Object
                (
                    [0] => name
                )
)

    [1] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [data_type] => text
                        )

                    [0] => Aug 01, 2011
                )

            [1] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [data_type] => text
                            [id] => 8699636
                        )

                    [0] => bfxgbfgxbfbgxfsfsdf
                )

        )

        [2] => Array

        (
            [0] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [data_type] => text
                        )

                    [0] => Aug 01, 2011
                )

            [1] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [data_type] => text
                            [id] => 8699694
                        )

                    [0] => bfxgbfgxbfbgxf
                )

        )
)

期望的输出(为每个附加列外推并删除@attributes):

array(
array("date","name"),
array("Aug 01, 2011","bfxgbfgxbfbgxfsfsdf"),
array("Aug 01, 2011","bfxgbfgxbfbgxf")
)

【问题讨论】:

  • 很难想象你在找什么

标签: php arrays object simplexml


【解决方案1】:

尝试改变

foreach ($xml->RESPONSE->DATA->HEADER->COLUMN as $column) {

$columns = (array)$xml->RESPONSE->DATA->HEADER->COLUMN;
foreach ($columns as $column) {

这应该将 SimpleXML 对象转换为简单数组。这应该消除“开销”。对foreach ($row->COLUMN as $datacolvalue){ 执行相同操作。

【讨论】:

  • 感谢@Znarkus,但这样做(假设我没有错误地实现它)会导致结构和数据丢失。我只返回第一列,所以间隔后跟日期,但没有别的。现在检查我的代码....
  • 如果您需要属性,为什么不遍历它们并创建一个数组呢?否则,像$data_row[] = array_merge((array)$datacolvalue, (array)$datacolvalue->attributes()) 这样的操作也可能有效。
  • (抱歉 - 出现了一些有线格式)这是我不需要的最里面的属性,例如@ 属性。从第一个内部数组中,我需要标题行的字符串“日期和名称”。然后从下一行我需要每个的值。我在开篇文章中发布了一个示例。谢谢。
【解决方案2】:

回答我自己的问题,因为我可能解释得不够好,但是指定一个(字符串)让我到达了我需要的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多