![]() |
|
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} |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |