Переформатирование PHP var_dump

Я только что подключился к веб-службе с помощью SoapClient. Веб-служба возвращает информацию о транспортном средстве на основе определенного ввода, VIN транспортного средства. Моя переменная $result установлена ​​равной выходным данным веб-службы; таким образом, var_dump ($result); выгружает всю информацию о транспортном средстве. Я с трудом его расшифровываю. Вот часть вывода, которую я получил для Audi VIN:

object(stdClass)#2 (14) {
    ["responseStatus"]=> object(stdClass)#3 (2) {
        ["responseCode"]=> string(10) "Successful"
        ["description"]=> string(10) "Successful"
    }
    ["vinDescription"]=> object(stdClass)#4 (11) {
        ["WorldManufacturerIdentifier"]=> string(17) "Germany Audi Nsu "
    }
}

Как я могу переформатировать вывод? Я хочу дергать за ниточки. Например, я хотел бы переформатировать вывод примера так, чтобы он выглядел так:

Ответ: Успешно
Мировой идентификатор производителя: Германия Audi Nsu
.

Вот мой код PHP (я пропустил свое имя пользователя и пароль для веб-службы):

<?php
$client = new SoapClient('http://services.chromedata.com/Description/7b?wsdl');
$account = ['number'=>"", 'secret'=>"", 'country'=>"US",    'language'=>"en"];
$vin = $_POST["b12"];

$result = $client->describeVehicle([
'accountInfo' => $account,
'vin' => $vin
]);



var_dump ($result);

?>

___________________________________________________________________________

Обнаружен еще один контрольно-пропускной пункт. Кажется, что чем дальше я копаюсь в данных, тем сложнее становятся вызывающие данные для создания новых переменных. Я пытаюсь извлечь Audi S4, 5 Door Wagon и All Wheel Drive.

Вот раздел, с которым я борюсь:

["technicalSpecification"]=>
array(97) {
 [0]=>
 object(stdClass)#640 (2) {
  ["titleId"]=>
  int(1)
  ["value"]=>
  array(2) {
    [0]=>
    object(stdClass)#641 (3) {
      ["styleId"]=>
      array(2) {
        [0]=>
        int(292015)
        [1]=>
        int(292016)
      }
      ["value"]=>
      string(7) "Audi S4"
      ["condition"]=>
      string(3) "-PT"
    }
    [1]=>
    object(stdClass)#642 (3) {
      ["styleId"]=>
      array(2) {
        [0]=>
        int(292015)
        [1]=>
        int(292016)
      }
      ["value"]=>
      string(7) "Audi S4"
      ["condition"]=>
      string(0) ""
    }
  }
}
[1]=>
object(stdClass)#643 (2) {
  ["titleId"]=>
  int(2)
  ["value"]=>
  object(stdClass)#644 (3) {
    ["styleId"]=>
    array(2) {
      [0]=>
      int(292015)
      [1]=>
      int(292016)
    }
    ["value"]=>
    string(12) "5 Door Wagon"
    ["condition"]=>
    string(0) ""
  }
}
[2]=>
object(stdClass)#645 (2) {
  ["titleId"]=>
  int(6)
  ["value"]=>
  object(stdClass)#646 (3) {
    ["styleId"]=>
    array(2) {
      [0]=>
      int(292015)
      [1]=>
      int(292016)
    }
    ["value"]=>
    string(15) "All-Wheel Drive"
    ["condition"]=>
    string(0) ""
  }
}

___________________________________________________________________________

Добавляя:

$resultxml = htmlentities($client->__getLastResponse()) . "\n";
echo $resultxml;

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

 <technicalSpecification>
        <titleId>1</titleId>
        <value value = "Audi S4" condition = "-PT">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
        <value value = "Audi S4" condition = "">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>2</titleId>
        <value value = "5 Door Wagon" condition = "">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
     <technicalSpecification>
        <titleId>6</titleId>
        <value value = "All-Wheel Drive" condition = "">
           <styleId>292015</styleId>
           <styleId>292016</styleId>
        </value>
     </technicalSpecification>
Стоит ли изучать 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 и хотите разрабатывать...
0
0
132
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Демонстрационный скрипт с неверным доступом к значениям:

<?php
$client = new SoapClient('http://services.chromedata.com/Description/7b?wsdl');
$account = ['number'=>"", 'secret'=>"", 'country'=>"US",    'language'=>"en"];
$vin = $_POST["b12"];

$result = $client->describeVehicle([
'accountInfo' => $account,
'vin' => $vin
]);

if (property_exists($result, 'responseCode') && property_exists($result,'WorldManufacturerIdentifier')){
    echo "Response : ".$result['responseStatus']['responseCode']."<br>World Manufacturer Id : ".$result['vinDescription']['WorldManufacturerIdentifier']."<br>";
}else{
    echo "The returned data is not complete!"; //or other proper error messages
}
?>

Отредактированный правильный сценарий находится здесь:

<?php
$client = new SoapClient('http://services.chromedata.com/Description/7b?wsdl');
$account = ['number'=>"", 'secret'=>"", 'country'=>"US",    'language'=>"en"];
$vin = $_POST["b12"];

$result = $client->describeVehicle([
'accountInfo' => $account,
'vin' => $vin
]);

if (property_exists($result, 'responseCode') && 
property_exists($result,'WorldManufacturerIdentifier')){
    echo "Response : ".$result->responseStatus->responseCode."<br>World Manufacturer Id : ".$result->vinDescription->WorldManufacturerIdentifier."<br>";
}else{
    echo "The returned data is not complete!"; //or other proper error messages
}
?>

Для последней части XML вы должны добавить дополнительные теги сворачивать вокруг результата XML, прежде чем загружать его вручную. Использование getElementsByTagName () и getAttribute позволяет мне загрузить результат с помощью функции цикла:

<?php
$doc = new DOMDocument();
$doc->loadXML('<some><technicalSpecification><titleId>1</titleId><value 
value = "Audi S4" condition = "-PT"><styleId>292015</styleId> 
<styleId>292016</styleId></value><value value = "Audi S4" condition = ""> 
<styleId>292015</styleId><styleId>292016</styleId></value> 
</technicalSpecification><technicalSpecification><titleId>2</titleId><value 
value = "5 Door Wagon" condition = ""><styleId>292015</styleId> 
<styleId>292016</styleId></value></technicalSpecification> 
<technicalSpecification><titleId>6</titleId><value value = "All-Wheel Drive" 
condition = ""><styleId>292015</styleId><styleId>292016</styleId></value> 
</technicalSpecification></some>');
$childs = $doc->getElementsByTagName("technicalSpecification");
foreach($childs as $child){
    $value = $child->getElementsByTagName("value")[0]->getAttribute("value");
echo $value;
}

Я попытался вызвать определенные переменные, используя аналогичный код: echo $result['WorldManufacturerIdentifier'];. Однако эта команда не была распознана.

mugelloblue 13.09.2018 05:08

@mugelloblue Могу ли я узнать сообщение об ошибке вывода, когда ошибка произошла?

gitguddoge 13.09.2018 05:13

Я переформатировал полученные вами данные, чтобы было понятнее, как получить нужные данные. Попробуйте $result->vinDescription->WorldManufacturerIdentifier или $result['vinDescription']['WorldManufacturerIdentifier'].

Greg Schmidt 13.09.2018 06:48

@mugelloblue Как и упомянул Грег, я пропустил взгляд на структуру данных и отредактировал ответ, структура данных должна быть $result[vinDescription'']['WorldManufacturerIdentifier'], а не просто $result['WorldManufacturerIdentifier']

gitguddoge 13.09.2018 08:32

@GregSchmidt @gitguddog Большое спасибо за ваши дополнения. Да, именно структура данных доставляла мне трудности. Кажется, $result->vinDescription->WorldManufacturerIdentifier отлично называет данные. Пока $result['vinDescription']['WorldManufacturerIdentifier'] не может вызвать данные. Есть идеи, почему одно будет преобладать над другим? Кажется, это одно и то же утверждение?

mugelloblue 14.09.2018 05:03

@mugelloblue Есть разница в доступе к множество или объект с помощью скобки или обозначения стрелок. Вы можете обратиться к этому вопрос, чтобы получить более ясное представление о доступе к значению. Между прочим, Грег отлично поработал)

gitguddoge 14.09.2018 05:08

@gitguddoge аааа да ссылка на объект и ссылка на массив. Спасибо!

mugelloblue 14.09.2018 05:14

@mugelloblue добро пожаловать, я тоже кое-что узнал :) буду редактировать ответ, хотя

gitguddoge 14.09.2018 05:15

@GregSchmidt @gitguddoge Я прорабатываю данные и наткнулся на часть, которую изо всех сил пытаюсь вызвать. Я пытаюсь извлечь 3 строки Audi S4, 5 Door Wagon и All-Wheel Drive. Я отредактировал вопрос, чтобы включить это. Любая помощь снова будет очень признательна.

mugelloblue 20.09.2018 03:47

Отступы в ваших данных представляют собой беспорядок, из-за чего кому-либо, включая меня и, предположительно, вас, трудно понять, какова реальная структура. Вы использовали предложение <pre> от @NorielleCruz?

Greg Schmidt 20.09.2018 03:52

@mugelloblue, как упомянул Грег, не могли бы вы использовать <pre> для форматирования результата? Нам сложно так смотреть на структуру

gitguddoge 20.09.2018 04:01

@GregSchmidt @gitguddoge Я немного обновил начало, но именно так оно отформатировано с помощью <pre>. С тех пор, как @NorielleCruz порекомендовал, я использую <pre>. Также добавлены скриншоты вывода. Есть предположения?

mugelloblue 20.09.2018 04:42

@mugelloblue Я бы посоветовал вам использовать Итерация объекта, где концепция состоит в том, чтобы пройти через многомерный массив / объект, вы можете сначала попробовать уровень за уровнем, чтобы проверить значение для текущего уровня, прежде чем двигаться дальше

gitguddoge 20.09.2018 04:45

@mugelloblue, скажем, для первого уровня вы можете попробовать for($result as $k1 => $v1){print_r($v1);}, и после того, как вы узнаете, что есть еще один уровень для $v1 во время цикла, вы можете добавить еще один уровень, где что-то вроде for($result as $k1 => $v1){for($v1 as $k2 => $v2){print_r($v2);}}, и на всякий случай, если вы испортили вещь $value, вы всегда можете использовать $result[$k1] на замену $v1

gitguddoge 20.09.2018 04:50

@gitguddoge Я проверю, спасибо! Вывод очень простой в XML, возможно, я могу просто изменить вывод $Result на XML и попытаться получить данные прямо оттуда.

mugelloblue 20.09.2018 04:52

@mugelloblue, если возвращаемый результат подтвержден в формате xml с использованием loadXML () из DOMDocument, намного лучше

gitguddoge 20.09.2018 04:53

@gitguddoge Я только что добавил вывод XML и как я добрался до сути вопроса. Вы бы назвали эти данные аналогичным образом? Что-то вроде $resultxml->$technicalSpecifications->and so on? Я проверю эту ссылку сейчас, спасибо!

mugelloblue 20.09.2018 05:00

@mugelloblue посмотри, так как я могу получить значение

gitguddoge 20.09.2018 05:25

@gitguddoge По-прежнему не может получить значение от DomDocument

mugelloblue 20.09.2018 05:49

Попробуйте отобразить элемент html предварительно над ним, он должен выглядеть так:

<?php
$client = new SoapClient('http://services.chromedata.com/Description/7b?wsdl');
$account = ['number'=>"", 'secret'=>"", 'country'=>"US",    'language'=>"en"];
$vin = $_POST["b12"];

$result = $client->describeVehicle([
'accountInfo' => $account,
'vin' => $vin
]);

echo "<pre>";
var_dump ($result);
echo "</pre>"; // optional       
?>

В качестве альтернативы используйте вместо этого print_r ().

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