Обработка данных SimpleXML - PullRequest
       8

Обработка данных SimpleXML

0 голосов
/ 31 августа 2011

Я близок к завершению скрипта, который использует simplexml для обработки некоторых данных, но я застрял на последнем.

Ну, не застрял, но любопытно и застрял.

$ tmp содержит мой XML (около 750 тыс.), И его цель - перевести его в формат для 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")
)

Ответы [ 2 ]

0 голосов
/ 31 августа 2011

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

0 голосов
/ 31 августа 2011

Попробуйте изменить

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){.

...