Php для каждого и xml

Я пытаюсь понять приведенный ниже код, который получает 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;
}

Можете ли вы немного сузить круг вопросов? Есть ли какие-то конкретные части, с которыми у вас возникли проблемы?

Don't Panic 18.09.2018 00:54

Это плохой код. Никогда не пытайтесь создавать собственные форматированные данные, будь то JSON, XML или даже CSV. Для этого используйте встроенные инструменты, такие как json_encode().

miken32 18.09.2018 02:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
20
1

Ответы 1

Функция 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
        )

)

Другие вопросы по теме