Имя: Пароль:
IT
Веб-мастеринг
php array2xml уже весь могз сломал, помогите написать рекурсивную функцию
0 sysadminlk
 
16.07.20
19:20
function array2xml($array, $doc=null) {
        if ($doc == null){
            // Creating new DOM document and loading HTML content
            $doc = new DomDocument('1.0', 'UTF-8');
            $doc->preserveWhiteSpace = false;
            $doc->formatOutput = true;
        }

        foreach ($array as $key => $val) {
            $root = $doc->createElement($key);
            $root = $doc->appendChild($root);

            if (gettype($val) == 'array'){
                //array2xml($val,$doc);
            }
            if (gettype($val) == 'string'){
                $value = $doc->createTextNode($val);
                $value = $root->appendChild($value);
            }
        }

        return $doc;
    }
1 vde69
 
16.07.20
19:24
во первых


>>>  if (gettype($val) == 'array'){

  if (is_array($val)){

-----------
>>>       if (gettype($val) == 'string'){

       if (is_string) {
2 vde69
 
16.07.20
19:26
во вторых

function array2xml($array, &$doc=null)
3 vde69
 
16.07.20
19:28
в третьих не хорошо это, там есть пара других вариантов, но точно не этот нужен

$doc == null
4 sysadminlk
 
16.07.20
19:31
(2) спасибо... помогло )
5 vde69
 
16.07.20
19:35
(4) но для рекусий такая передача (по ссылки) не всегда есть хорошо, например первый параметр так передавать нельзя.
6 sysadminlk
 
16.07.20
19:38
(5) да теперь в этом затык )
7 sysadminlk
 
16.07.20
19:39
(array) Array
(
    [receipts] => Array
        (
            [exchangeCode] => 4c61ed37-733f-403d-8291-71d8c2d07010
            [createdDate] => 2020-07-07
            [type] => 10
            [isIndustry] => false
            [receiptTypeCode] => 10
            [invoiceDeliveryTypeCode] => 100
            [vatDeliveryTypeCode] => 100
            [vatCode] => 10
            [currencyCode] => 417
            [currencyName] => 1
            [exchangeRate] => 1
            [paymentTypeCode] => 20
            [isResident] => true
            [isPriceWithoutTaxes] => false
            [markGoods] => false
            [note] => Тестовый
            [goods] => Array
                (
                    [good] => Array
                        (
                            [0] => Array
                                (
                                    [stCode] => 50
                                    [goodsName] => All-in-One МФУ Hewlett-Packard
                                    [baseCount] => 2.00000
                                    [price] => 100
                                )

                        )

                )

        )

)
8 sysadminlk
 
16.07.20
19:40
на выходе получается

<?xml version="1.0" encoding="UTF-8"?>
<exchangeCode>4c61ed37-733f-403d-8291-71d8c2d07010</exchangeCode>
<createdDate>2020-07-07</createdDate>
<type>10</type>
<isIndustry>false</isIndustry>
<receiptTypeCode>10</receiptTypeCode>
<invoiceDeliveryTypeCode>100</invoiceDeliveryTypeCode>
<vatDeliveryTypeCode>100</vatDeliveryTypeCode>
<vatCode>10</vatCode>
<currencyCode>417</currencyCode>
<paymentTypeCode>20</paymentTypeCode>
<bankAccount>1272000200105802</bankAccount>
<contractorPin>02711201210122</contractorPin>
<isResident>true</isResident>
<isPriceWithoutTaxes>false</isPriceWithoutTaxes>
<markGoods>false</markGoods>
<note>Тестовый</note>
<stCode>50</stCode>
<goodsName>All-in-One МФУ Hewlett-Packard</goodsName>
<baseCount>2.00000</baseCount>
<price>100</price>
9 sysadminlk
 
16.07.20
19:40
при таком варианте:

    function array2xml($array, &$doc=null) {
        if ($doc == null){
            // Creating new DOM document and loading HTML content
            $doc = new DomDocument('1.0', 'UTF-8');
            $doc->preserveWhiteSpace = false;
            $doc->formatOutput = true;
        }

        foreach ($array as $key => $val) {
            if (gettype($val) == 'array'){
                array2xml($val,$doc);
            }
            if (gettype($val) == 'string'){
                $node= $doc->createElement($key);
                $node = $doc->appendChild($node);
                $value = $doc->createTextNode($val);
                $node->appendChild($value);
            }
        }

        return $doc;
    }

    //print_arr($data);
    $xml = array2xml($data);
    $xml_string = $xml->saveXML() ;
    echo $xml_string;
10 vde69
 
16.07.20
19:41
(7) ключи в кавычки возьми
11 sysadminlk
 
16.07.20
19:42
т.е. надо теперь обмозговать как его в родительские ноды воткнуть
12 vde69
 
16.07.20
19:42
(array) Array
(
    'receipts' => Array
        (
            'exchangeCode' => 4c61ed37-733f-403d-8291-71d8c2d07010
            'createdDate' => 2020-07-07
13 sysadminlk
 
16.07.20
19:45
(12) зачем?
14 vde69
 
16.07.20
19:46
if (is_string($val)){
                $node= $doc->createElement($key);
                $value = $doc->createTextNode($val);
                $node->appendChild($value);
                $doc->appendChild($node);
            }
15 sysadminlk
 
16.07.20
19:55
нет так тоже вложенности нет (14)
чет я уже задолбался, там всего 3 уровня вложенности, проще ручками описать без рекурсии
спасибо
16 sysadminlk
 
16.07.20
19:56
хотя истина была где-то рядом
17 vde69
 
16.07.20
20:02
можно так, только это будет быдлокод по отношению к памяти


function array2xml($array, $doc=null) {
        if ($doc == null){
            // Creating new DOM document and loading HTML content
            $doc = new DomDocument('1.0', 'UTF-8');
            $doc->preserveWhiteSpace = false;
            $doc->formatOutput = true;
        }

        foreach ($array as $key => $val) {
            $root = $doc->createElement($key);
            $root = $doc->appendChild($root);

            if (gettype($val) == 'array'){
                $doc=array2xml($val,$doc);
            }
            if (gettype($val) == 'string'){
                $value = $doc->createTextNode($val);
                $value = $root->appendChild($value);
            }
        }

        return $doc;
    }
18 sysadminlk
 
16.07.20
20:24
(17) так не работает

Fatal error: Uncaught exception 'DOMException' with message 'Invalid Character Error' in /home/userp/www/voda.link.kg/esf.php:204
Stack trace:
#0 /home/userp/www/v/esf.php(204): DOMDocument->createElement('0')
#1 /home/userp/www/v/esf.php(208): array2xml(Array, Object(DOMDocument))
#2 /home/userp/www/v/esf.php(208): array2xml(Array, Object(DOMDocument))
#3 /home/userp/www/v/esf.php(208): array2xml(Array, Object(DOMDocument))
#4 /home/userp/www/v/esf.php(220): array2xml(Array)
#5 {main}