Я пытаюсь понять приведенный ниже код, который получает XML и преобразует его в JSON. Но не уверен, как это работает.
function splicing_json($xml){
$str='';
foreach($xml->children() as $child)
{
if (count($child)===0){
$str .= '"'.$child->getName().'":"'.$child.'",';
}else if (count($child)>0){
$str .= '"' . $child->getName() . '":{';
foreach($child->children() as $val){
if (count($val)>0) {
$str .='"' . $val->getName() . '":{'.splicing_json($val).'},';
}else if (count($val)===0){
$str .= '"' . $val->getName() . '":"'.$val.'",';
}
}
$str .= '},';
}
}
return $str;
}
Это плохой код. Никогда не пытайтесь создавать собственные форматированные данные, будь то JSON, XML или даже CSV. Для этого используйте встроенные инструменты, такие как json_encode().






Функция splicing_json обрабатывает дочерние XML-узлы, она не очень эффективна и не будет работать, если у вас есть несколько XML-узлов с одинаковым именем, но давайте возьмем этот XML-файл в качестве примера:
<?xml version = "1.0" encoding = "UTF-8"?>
<bookstore>
<simple_text>Hi there!</simple_text>
<book category = "cooking">
<title lang = "en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<phone category = "children">
<owners category = "children">
<name>Mostafa</name>
<address>Cairo</address>
</owners>
<title lang = "en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</phone>
<game category = "web">
<title lang = "en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</game>
</bookstore>
Дочерний № 1: simple_text - это первый дочерний узел, который будет обрабатываться функцией, это строковое значение, поэтому (count($child)===0) будет истинным и будет добавлено к json str как строковое значение "simple_text":"Hi there!",.
Дочерний # 2, второй узел, который будет обрабатываться функцией, - это книга, это массив, поэтому (count($child)>0) будет истинным, функция затем перехватывает дочерние узлы узла книги, и если какой-либо из ее узлов является массивом, он будет запускаться рекурсивно и обработайте его снова if (count($val)>0), в противном случае он просто добавит значение дочернего узла так же, как это было с Child # 1, а затем добавит его в переменную str.
Дочерний № 3, этот будет обрабатываться так же, как Дочерний № 2, но у него есть узел с именем «владельцы», который содержит массив, if (count($val)>0), этот оператор вернет истину, что означает, что он будет повторно обработан splicing_json, и тот же процесс будет снова запустить только на этом узле. затем возвращаемое функцией значение будет добавлено к основной переменной str.
Это простая рекурсивная функция, которая выполняет итерацию, пока не будут обработаны все узлы.
если вы декодируете вывод, он должен выглядеть примерно так:
Array
(
[simple_text] => Hi there!
[book] => Array
(
[title] => Everyday Italian
[author] => Giada De Laurentiis
[year] => 2005
[price] => 30.00
)
[phone] => Array
(
[owners] => Array
(
[name] => Mostafa
[address] => Cairo
)
[title] => Harry Potter
[author] => J K. Rowling
[year] => 2005
[price] => 29.99
)
[game] => Array
(
[title] => Learning XML
[author] => Erik T. Ray
[year] => 2003
[price] => 39.95
)
)
Можете ли вы немного сузить круг вопросов? Есть ли какие-то конкретные части, с которыми у вас возникли проблемы?