将xml child添加到数组php

时间:2015-09-29 15:45:20

标签: php xml

我尝试使用php将每个<outfit>Subnodes</outfit>子节点添加到数组中。

我的实际代码:

public static function get_outfits($username) {
   $files = self::user_files($username);
   $data  = self::request($files['outfits']);
   $data  = @simplexml_load_string($data);
   if ( $data && count(@$data->xpath('//outfits/outfit')) > 0 ) {
      foreach(@$data->xpath('//outfits/outfit/*') as $items) {
         $response['outfits']['items'][] = array(
            "url"          => (string)$items['url'],
            "c"            => (string)$items['c'],
            "c2"           => (string)$items['c2'],
            "displayName"  => (string)$items['displayName'],
            "z"            => (string)$items['z'],
            "id"           => (string)$items['id'],
            "isUgc"        => (string)$items['isUgc']
         );
      }
   }
   return (isset($response) ? $response : false);
}

xml文档如下所示: http://outfits.zwinky.com/users/220/287/_perverted/outfits.xml

可悲的是,代码将每个现有的子节点保存到一个数组中。但是我试图为应该包含子元素的每个<outfit></outfit>节点创建一个数组索引。

例如:

数组[0] =第一个<outfit><outfit>

之间的所有内容

数组[1] =第二个<outfit><outfit>

之间的所有内容

有没有人有想法,如何创建这个?

2 个答案:

答案 0 :(得分:0)

如果这是您想要的输出: -

Array
(
    [0] => Array
        (
            [url] => http://assets.zwinky.com/assets/babe/heads/01/head1
            [c] => 0xF4C4A4
            [c2] => 0xffffff
            [displayName] => 
            [z] => 33000
            [id] => 
            [isUgc] => 
        )

    [1] => Array
        (
            [url] => http://assets.zwinky.com/assets/babe/faces/01/grl1
            [c] => 0x0
            [c2] => 0xFF0000
            [displayName] => girl1
            [z] => 34000
            [id] => 20014794
            [isUgc] => 
        )

    [2] => Array
        (
            [url] => http://assets.zwinky.com/assets/babe/midsections/01/ms1
            [c] => 0xBCE4FE
            [c2] => 
            [displayName] => 
            [z] => 9000
            [id] => 
            [isUgc] => 
        )

... etc etc

然后您需要做的就是将代码更改为

public static function get_outfits($username) {
   $files = self::user_files($username);
   $data  = self::request($files['outfits']);
   $data  = @simplexml_load_string($data);
   if ( $data && count(@$data->xpath('//outfits/outfit')) > 0 ) {
      foreach(@$data->xpath('//outfits/outfit/*') as $items) {

         // $response['outfits']['items'][] = array(

         $response[] = array(
            "url"          => (string)$items['url'],
            "c"            => (string)$items['c'],
            "c2"           => (string)$items['c2'],
            "displayName"  => (string)$items['displayName'],
            "z"            => (string)$items['z'],
            "id"           => (string)$items['id'],
            "isUgc"        => (string)$items['isUgc']
         );
      }
   }
   return (isset($response) ? $response : false);
}

答案 1 :(得分:0)

您需要两个循环,一个用于outfit元素,另一个用于内部item元素。另一方面,你不需要这个条件,因为迭代一个空的数组/节点列表工作正常。

$outfits = new SimpleXmlElement($xml);

$result = [];
foreach ($outfits->xpath('outfit') as $outfit) {
  $items = [];
  foreach ($outfit->xpath('*') as $item) {
    $items[$item->getName()] = [
      "url" => (string)$item['url'],
      "c" => (string)$item['c'],
      "c2" => (string)$item['c2'],
      "displayName" => (string)$item['displayName'],
      "z" => (string)$item['z'],
      "id" => (string)$item['id'],
      "isUgc" => (string)$item['isUgc']
    ];
  }
  $result[] = [
    'name' => (string)$outfit['name'],
    'items' => $items
  ];
}

var_dump($result);

输出:

array(14) {
  [0]=>
  array(2) {
    ["name"]=>
    string(6) "babe13"
    ["items"]=>
    array(14) {
      ["head"]=>
      array(7) {
        ["url"]=>
        string(51) "http://.../assets/babe/heads/01/head1"
        ["c"]=>
        string(8) "0xF4C4A4"
        ["c2"]=>
        string(8) "0xffffff"
        ["displayName"]=>
        string(0) ""
        ["z"]=>
        string(5) "33000"
        ["id"]=>
        string(0) ""
        ["isUgc"]=>
        string(0) ""
      }
      ["face"]=>
      array(7) {
        ["url"]=>
        string(50) "http://.../assets/babe/faces/01/grl1"
        ["c"]=>
        string(3) "0x0"
        ["c2"]=>
        string(8) "0xFF0000"
        ["displayName"]=>
        string(5) "girl1"
        ["z"]=>
        string(5) "34000"
        ["id"]=>
        string(8) "20014794"
        ["isUgc"]=>
        string(0) ""
      }
      ...