Я создал функцию ниже:
public function arrayToXml(\SimpleXMLElement $bodyXml, array $arrayToBeConverted)
{
foreach ($arrayToBeConverted as $element => $value) {
$element = ucfirst($element);
if (is_array($value)) {
$newXmlNode = $bodyXml->addChild($element);
$newXmlNode = $this->arrayToXml($newXmlNode, $value);
} else {
$bodyXml->addChild($element, $value);
}
}
$newXml = $bodyXml;
return $newXml;
}
}
Который преобразует массив в XML. Я пытаюсь создать дубликаты в XML и, кажется, столкнулся с проблемой при использовании массива внутри.
Следующий массив …
$testArray =
[
"Pagination" =>
[
"EntriesPerPage" => 2,
],
["UserId" => "Usertest1"], ["UserId" => "Usertest2"],
];
Выводит этот раздел XML
<pagination>
<entriesperpage>2</entriesperpage>
</pagination>
“<0>"<userid>Usertest1</userid>
“<1>"<userid>Usertest2</userid>
Я в принципе не хочу <0> и <1> До идентификатора пользователя я понимаю, почему эти индексы существуют, но я не могу найти способ заставить это работать без них. У какого-нибудь мастера массивов есть какие-нибудь идеи, пожалуйста?
Спасибо за чтение.
попробуй это
public function arrayToXml(\SimpleXMLElement $bodyXml, array $arrayToBeConverted)
{
foreach ($arrayToBeConverted as $element => $value) {
$element = ucfirst($element);
if (is_array($value)) {
$pattern = '/^\d/';
if (!preg_match($pattern, $element)){
$newXmlNode = $bodyXml->addChild($element);
$newXmlNode = $this->arrayToXml($newXmlNode, $value);
}
else{
$bodyXml = $this->arrayToXml($bodyXml, $value);
}
} else {
$bodyXml->addChild($element, $value);
}
}
$newXml = $bodyXml;
return $newXml;
}
Если вы хотите получить что-то подобное
<Pagination>
<EntriesPerPage>2</EntriesPerPage>
</Pagination>
<UserId>Usertest1</UserId>
<UserId>Usertest2</UserId>
тогда вам нужно изменить исходный массив $ arrayToBeConverted. Должно выглядеть так
$testArray =
[
["Pagination" => ["EntriesPerPage" => 2]],
["UserId" => "Usertest1"],
["UserId" => "Usertest2"]
];
и добавить дополнительный foreach
foreach ($arrayToBeConverted as $arrayToBeConvertedElements) {
foreach ($arrayToBeConvertedElements as $element => $value) {
$element = ucfirst($element);
if (is_array($value)) {
$newXmlNode = $bodyXml->addChild($element);
$newXmlNode = $this->arrayToXml($newXmlNode, $value);
} else {
$bodyXml->addChild($element, $value);
}
}
}
Сложность состоит в том, чтобы знать, когда использовать ключ массива в качестве элемента, а когда нет. Даже когда вы используете [ 'a', 'b' ]
это эквивалентно [ 0=>'a', 1=>'b']
,
Если вы используете тот факт, что автоматически сгенерированные ключи являются целыми числами (или не строками) …
public function arrayToXml(\SimpleXMLElement $bodyXml, array $arrayToBeConverted)
{
foreach ($arrayToBeConverted as $element => $value) {
if (is_array($value)) {
if ( is_string($element) ) {
$newXmlNode = $bodyXml->addChild(ucfirst($element));
}
$newXml = $this->arrayToXml($newXmlNode, $value);
} else {
$newXml->addChild($element, $value);
}
}
return $newXml;
}