Адский массив PHP XML

Я пытаюсь получить данные массива XML. Вот данные, которые я ввел:

[MyCallResult] => SimpleXMLElement Object
    (
        [errorMessage] => SimpleXMLElement Object
            (
            )

        [arrayAvailableField] => SimpleXMLElement Object
            (
                [MyCall.output.AvailableField] => Array
                    (
                        [0] => SimpleXMLElement Object
                            (
                                [fieldName] => orderno
                                [fieldValue] => 10314451
                                [sequenceNumber] => 1
                            )

                        [1] => SimpleXMLElement Object
                            (
                                [fieldName] => ordersuf
                                [fieldValue] => 00
                                [sequenceNumber] => 2
                            )

                        [2] => SimpleXMLElement Object
                            (
                                [fieldName] => custno
                                [fieldValue] => 16137
                                [sequenceNumber] => 3

И это касается еще 30+ полей. Я хочу пройти через цикл и выбрать то, что мне нужно, с помощью чего-то вроде оператора IF (если $ node-> fieldname = "orderno", то $ orderno = $ node-> fieldValue)

Я могу выполнить цикл foreach и получить все значения, но я не могу получить оператор if, чтобы все продолжалось (например, if находит совпадение и выходит из цикла).

Вот кое-что, что я пробовал:

    foreach ($xml->MyCall->arrayAvailableField-> "MyCall.output.AvailableField"} as $node) {
    if ($node['fieldName'] = "orderno") {
        $ordno = $node->fieldValue;
    } elseif ($node['fieldname'] = "ordersuf") {
        $ordersuf = $node->fieldValue;
    }
    }

По крайней мере, я получил первый заказ - нет - а остальные не удалось.

Я новичок в PHP, поэтому уверен, что иду по неправильному пути - любая помощь будет принята с благодарностью.

дважды проверьте использование знака равенства ... например, $node['fieldName'] = "orderno" должен быть $node['fieldName'] == "orderno", это может быть простая опечатка :)

Scuzzy 19.09.2018 01:35

Привет, в подобных вопросах лучше всего предоставить минимальный воспроизводимый пример - то есть небольшой фрагмент кода в самом вопросе, который мы можем скопировать и вставить, чтобы воспроизвести проблему самостоятельно. В случае XML, вместо отображения вывода print_r или var_dump, включите небольшой раздел самого XML; тогда кому-то будет проще поиграть с разными способами доступа к нему.

IMSoP 19.09.2018 18:51
Стоит ли изучать 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 и хотите разрабатывать...
2
2
62
2

Ответы 2

Скорее всего, ваша проблема связана с опечаткой вокруг единственного знака равенства

if ($node['fieldName'] = "orderno") {
    $ordno = $node->fieldValue;
} elseif ($node['fieldname'] = "ordersuf") {
    $ordersuf = $node->fieldValue;
}

Измените его, чтобы использовать двойное равенство:

if ($node['fieldName'] == "orderno") {
    $ordno = $node->fieldValue;
} elseif ($node['fieldname'] == "ordersuf") {
    $ordersuf = $node->fieldValue;
}

ваше первое «если» всегда правда в противном случае

FWIW, я нашел ответ - может быть, не элегантно, но работает. Вот что у меня получилось:

$x = $xml->xpath("//MyCall.output.AvailableField");

for ($y = 0; $y <= count($x)-1; $y++) {
switch (trim($x[(int)$y]->fieldName)) {
    case "orderno": $orderno = $x[(int)$y]->fieldValue; break;
    case "ordersuf": $ordersuf = $x[(int)$y]->fieldValue; break;
    case "custno": $custno = $x[(int)$y]->fieldValue; break;

Я получаю данные, так счастлив турист. Еще раз спасибо всем, кто помогал :)

Как я уже сказал - новинка на этом сайте :)

Brian 20.09.2018 18:14

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