-
Notifications
You must be signed in to change notification settings - Fork 9.4k
/
Copy pathConvertArray.php
112 lines (106 loc) · 3.42 KB
/
ConvertArray.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Framework\Convert;
use Magento\Framework\Exception\LocalizedException;
/**
* Convert the array data to SimpleXMLElement object
*/
class ConvertArray
{
/**
* Transform an assoc array to \SimpleXMLElement object
* Array has some limitations. Appropriate exceptions will be thrown
*
* @param array $array
* @param string $rootName
* @return \SimpleXMLElement
* @throws LocalizedException
*/
public function assocToXml(array $array, $rootName = '_')
{
if (empty($rootName) || is_numeric($rootName)) {
throw new LocalizedException(
new \Magento\Framework\Phrase(
"The root element can't be empty or use numbers. Change the element and try again."
)
);
}
$xmlStr = <<<XML
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<$rootName></$rootName>
XML;
$xml = new \SimpleXMLElement($xmlStr);
foreach (array_keys($array) as $key) {
if (is_numeric($key)) {
throw new LocalizedException(
new \Magento\Framework\Phrase('An error occurred. Use non-numeric array root keys and try again.')
);
}
}
return self::_assocToXml($array, $rootName, $xml);
}
/**
* Convert nested array into flat array.
*
* @param array $data
* @return array
*/
public static function toFlatArray($data)
{
foreach ($data as $key => $value) {
if (is_array($value)) {
$value = self::toFlatArray($value);
unset($data[$key]);
$data = array_merge($data, $value);
}
}
return $data;
}
/**
* Function, that actually recursively transforms array to xml
*
* @param array $array
* @param string $rootName
* @param \SimpleXMLElement $xml
* @return \SimpleXMLElement
* @throws LocalizedException
*/
private function _assocToXml(array $array, $rootName, \SimpleXMLElement $xml)
{
$hasNumericKey = false;
$hasStringKey = false;
foreach ($array as $key => $value) {
if (!is_array($value)) {
if (is_string($key)) {
if ($key === $rootName) {
throw new LocalizedException(
new \Magento\Framework\Phrase(
"An associative key can't be the same as its parent associative key. "
. "Verify and try again."
)
);
}
$hasStringKey = true;
$xml->addChild($key, $value);
} elseif (is_int($key)) {
$hasNumericKey = true;
$xml->addChild($key, $value);
}
} else {
$xml->addChild($key);
self::_assocToXml($value, $key, $xml->{$key});
}
}
if ($hasNumericKey && $hasStringKey) {
throw new LocalizedException(
new \Magento\Framework\Phrase(
"Associative and numeric keys can't be mixed at one level. Verify and try again."
)
);
}
return $xml;
}
}