Как использовать регулярные выражения в JSON (PHP)? - PullRequest
0 голосов
/ 09 февраля 2010

Теперь у меня есть такой код json:

{"1":
    {
    "text":"e1",
    "children":
        {
        "1":
            {
            "text":"e1_site1",
            "children":
                {"1":"e1_site1_salarie1_nom"}
            },
        "3":
            {
            "text":"e1_site2",
            "children":
                {
                "3":"e1_site2_sa1",
                "4":"e1_site2_sa2"
                }
            }
        }
    },
"2":
    {
    "text":"e2",
    "children":
        {
        "2":
            {
            "text":"e2_site2",
            "children":
                {
                "2":"e2_site2_salarie2_nom"
                }
            }
        }
    }
}

И я хочу, чтобы это было:

[
    {
    "text":"e1",
    "children":
    [
        {
        "text":"e1_site1",
        "children":
        [
            {
            "text":"e1_site1_salarie1_nom"
            }
        ],
        "text":
            {
            "text":"e1_site2",
            "children":
            [
                {
                "text":"e1_site2_sa1"
                },
                {
                "text":"e1_site2_sa2"
                }
            ]
            }
    ],
    "text":
        {
        "text":"e2",
        "children":
        [
            {
            "text":"e2_site2",
            "children":
            [
                {
                "text":"e2_site2_salarie2_nom"
                }
            ]
            }
        ]
        }

То, что я сделал прямо сейчас, не завершено и не закончено:

$json = json_encode($entreprise);
$mode = array("/{\"[0-9]\":{\"text\"/", "/children\":{\"[0-9]\"/","/,\"[0-9]\":{\"/", "/,\"[0-9]\":\"/","(}})");
$replacement = array("[{\"text\"","children\":[{\"text\"",",\"text\":{\"",",\"text\":\"","}]");
$json = preg_replace($mode, $replacement, $json);
dump($json);

И текущий результат:

[
    {
    "text":"e1",
    "children":
    [
        {
        "text":"e1_site1",
        "children":
        [
            {
            "text":"e1_site1_salarie1_nom"
            }
        ],
        "text":
            {
            "text":"e1_site2",
            "children":
            [
                {
                "text":"e1_site2_sa1",
                "text":"e1_site2_sa2"
                }
            ]
            }
    ],
    "text":
        {
        "text":"e2",
        "children":
        [
            {
            "text":"e2_site2",
            "children":
            [
                {
                "text":"e2_site2_salarie2_nom"
                }
            ]
            }
        ]
        }

Знаете ли вы, как добиться идеального вывода с помощью регулярного выражения?

Любые идеи или предложения будут оценены !! Заранее спасибо. ;)

Edit:

Вывод был изменен в соответствии с рекомендацией soulmerge. Это так:

[
    {
    "text":"e1",
    "children":
        {
        "1":
            {
            "text":"e1_site1",
            "children":
                {
                "1":"e1_site1_salarie1_nom"
                }
            },
        "3":
            {
            "text":"e1_site2",
            "children":
                {
                "3":"e1_site2_sa1",
                "4":"e1_site2_sa2"
                }
            }
        }
    },
    {
    "text":"e2",
    "children":
        {
        "2":
            {
            "text":"e2_site2",
            "children":
                {
                "2":"e2_site2_salarie2_nom"
                }
            }
        }
    }
]

Но мне все еще предстоит долгий путь к моему идеальному результату.

Кто-нибудь знает, как это сделать?

Ответы [ 3 ]

6 голосов
/ 09 февраля 2010

Регулярные выражения - худший подход, который вы можете использовать здесь:

  • Вам будет трудно понять, что вы сделали, если вернетесь к этому коду через 3 месяца,
  • Легко делать ошибки, которые трудно обнаружить,
  • Код сломается, если PHP решит изменить код генерации json

Я бы рекомендовал выполнять все операции с массивом $entreprise без каких-либо рисков, а , а затем , вызывая json_encode().

Причина, по которой сгенерированный JSON имеет объекты вместо массивов, заключается в том, что исходный массив не индексируется 0. Просто попробуйте это, например:

dump(json_encode(array_values($enterprise)));
1 голос
/ 09 февраля 2010

JSON не является обычным языком, и поэтому вы не можете использовать регулярные выражения для его анализа. И ваш ожидаемый вывод не является допустимым JSON, так как не может быть несколько вхождений одного и того же ключа, как в

{
    "text":"e1_site2_sa1",
    "text":"e1_site2_sa2"
}
0 голосов
/ 09 февраля 2010

Вы должны найти способ вывода желаемого вывода json из json_encode, а не выводить то, что вам не нужно, а затем обмануть их с помощью регулярных выражений. Поэтому я предполагаю, что работа связана с вашей структурой данных, а не с выводом текста ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...