【问题标题】:PHP - JSON encode output contains only 1 XML entry instead of multiplePHP - JSON 编码输出仅包含 1 个 XML 条目而不是多个
【发布时间】:2021-03-26 05:49:38
【问题描述】:

更新:

上一篇:link

好的,所以我让代码为 1 位客户完美运行。现在我遇到了另一个问题,如果我想接收多个客户作为 JSON 输出,我该怎么做?

我在状态为 C 的帐户下创建了第二个条目,并修改了我到目前为止收到的代码部分,以基本上从所有状态为 C 的帐户中输出名称/电子邮件/...。但是我只收到第一个它看到了。应该是哪里搞错了

$document = new DOMDocument();
$document->loadXML($response);
$xpath = new DOMxpath($document);

$json = [];
foreach ($xpath->evaluate('(/eExact/Accounts)') as $account) {
    $json['email'] = $xpath->evaluate('string(Account[@status="C"]/Email)', $account);
    
    $json['first_name'] = $xpath->evaluate('string(Account[@status="C"]/Contact[@default="1"]/FirstName)', $account);
    $json['last_name'] = $xpath->evaluate('string(Account[@status="C"]/Contact[@default="1"]/LastName)', $account);
    $json['billing'] = [
      'first_name' => $xpath->evaluate('string(Account[@status="C"]/Contact[@default="1"]/FirstName)', $account),
      'last_name' => $xpath->evaluate('string(Account[@status="C"]/Contact[@default="1"]/LastName)', $account),
      'postcode'=> $xpath->evaluate('string(Account[@status="C"]/Address[@default="1"]/PostalCode)', $account),
    ];

    // ...
}

$customer = json_encode($json, JSON_PRETTY_PRINT);
echo $customer; 

输出:

{
    "email": "example1@example1.com",
    "first_name": "John",
    "last_name": "Doe",
    "billing": {
        "first_name": "John",
        "last_name": "Doe",
        "postcode": "10000"
    }
}[Finished in 0.4s]

我真正想要的是这样的:[或者换句话说,所有状态 C 帐户]

 {
        "email": "example1@example1.com",
        "first_name": "John",
        "last_name": "Doe",
        "billing": {
            "first_name": "John",
            "last_name": "Doe",
            "postcode": "10000"
        }
 {
        "email": "example2@example2.com",
        "first_name": "Steve",
        "last_name": "Doe",
        "billing": {
            "first_name": "Steve",
            "last_name": "Doe",
            "postcode": "20000"
        }

【问题讨论】:

    标签: php json xml php-curl


    【解决方案1】:

    您正在创建一个数组并在每次循环中覆盖它。有多种追加方式,但使用现有代码,您可以执行以下操作:

    foreach ($xpath->evaluate('(/eExact/Accounts)') as $account) {
        $json['email'] = $xpath->evaluate('string(Account[@status="C"]/Email)', $account);        
        $json['first_name'] = $xpath->evaluate('string(Account[@status="C"]/Contact[@default="1"]/FirstName)', $account);
        $json['last_name'] = $xpath->evaluate('string(Account[@status="C"]/Contact[@default="1"]/LastName)', $account);
        $json['billing'] = [
          'first_name' => $xpath->evaluate('string(Account[@status="C"]/Contact[@default="1"]/FirstName)', $account),
          'last_name' => $xpath->evaluate('string(Account[@status="C"]/Contact[@default="1"]/LastName)', $account),
          'postcode'=> $xpath->evaluate('string(Account[@status="C"]/Address[@default="1"]/PostalCode)', $account),
        ];
        // append to your result here
        $result[] = $json;
    }
    $customer = json_encode($result, JSON_PRETTY_PRINT);
    echo $customer; 
    

    【讨论】:

      【解决方案2】:

      每次迭代都会覆盖 $json 数组键。你把它做成一维数组,你需要的是一个多维数组(其中每个元素都是另一个数组):

      foreach ($xpath->evaluate('(/eExact/Accounts)') as $account) {
          $json[] = [
              'email' => $xpath->evaluate('string(Account[@status="C"]/Email)', $account),
              'first_name' => $xpath->evaluate('string(Account[@status="C"]/Contact[@default="1"]/FirstName)', $account),
              'last_name' => $xpath->evaluate('string(Account[@status="C"]/Contact[@default="1"]/LastName)', $account),
              'billing' => [
                  'first_name' => $xpath->evaluate('string(Account[@status="C"]/Contact[@default="1"]/FirstName)', $account),
                  'last_name' => $xpath->evaluate('string(Account[@status="C"]/Contact[@default="1"]/LastName)', $account),
                  'postcode'=> $xpath->evaluate('string(Account[@status="C"]/Address[@default="1"]/PostalCode)', $account),
              ],
          ];
      }
      

      这里的键是$json[] = ... - 这告诉 PHP 在数组中创建一个新元素并为其分配后面的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-19
        • 1970-01-01
        • 1970-01-01
        • 2019-05-06
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        相关资源
        最近更新 更多