-
Notifications
You must be signed in to change notification settings - Fork 9.4k
/
Copy pathConvertArray.php
113 lines (108 loc) · 3.55 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
113
<?php
/**
* Magento
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@magentocommerce.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade Magento to newer
* versions in the future. If you wish to customize Magento for your
* needs please refer to http://www.magentocommerce.com for more information.
*
* @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*/
namespace Magento\Framework\Convert;
use Magento\Framework\Exception;
/**
* 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 Exception
*/
public function assocToXml(array $array, $rootName = '_')
{
if (empty($rootName) || is_numeric($rootName)) {
throw new Exception('Root element must not be empty or numeric');
}
$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 Exception('Array root keys must not be numeric.');
}
}
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 Exception
*/
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 Exception('Associative key must not be the same as its parent associative key.');
}
$hasStringKey = true;
$xml->{$key} = $value;
} elseif (is_int($key)) {
$hasNumericKey = true;
$xml->{$rootName}[$key] = $value;
}
} else {
self::_assocToXml($value, $key, $xml->{$key});
}
}
if ($hasNumericKey && $hasStringKey) {
throw new Exception('Associative and numeric keys must not be mixed at one level.');
}
return $xml;
}
}