【问题标题】:PHP: How to create an array automatically with same keysPHP:如何使用相同的键自动创建数组
【发布时间】:2014-09-11 07:19:20
【问题描述】:

我有一个对象,其中包含一些有关人员的信息:

name, age, type

对于 xml 请求,我需要这样的人员数组:

<persons itc=3>
  <person id=1 type=H age=30 />
  <person id=2 type=H age=35 />
  <person id=3 type=H age=6 />
</persons>

我想自动创建它,例如使用foreach,xml结中的所有属性之前都用“@”标记,以便在此之后调用的函数知道如何构建xml:

foreach($object->getPersons as $person) {
  $array['persons'] = array(
     'person' = array(
        '@id' =>  $person->getId(),
        '@type' =>  $person->getType(),
        '@age' =>  $person->getAge(),
     )
  )
}

但是,据我所知,不可能有一个具有多个同名键的数组,逻辑上......! Bute 如何为我的对象创建这个 xml-schema ou?有人可以给我一个提示吗? 谢谢!

【问题讨论】:

  • 也许是一个多维数组?
  • 等等最后的输出是什么?一个包含数组数据的 xml?
  • @Zwen2012 这里的上下文是什么,你打算最后创建一个xml吗?
  • 是的,我正在计划一个 XML!
  • @Zwen2012 如果你想创建一个xml,你为什么要创建一个数组?使用SimpleXMLElement

标签: php arrays xml


【解决方案1】:

如果您打算将所有数组命名为相同的名称,为什么还要命名它们?
与其创建关联数组,不如创建一个普通的索引数组,类似于:

$array['persons'] = array();
foreach($object->getPersons as $person) {
  $array['persons'][] = array( "@id"   => $person->getId(),
                               "@type" => $person->getType(),
                               "@age"  => $person->getAge() );
}

【讨论】:

    【解决方案2】:

    $array 变量的多维数组应该如下所示:

    foreach($object->getPersons as $person) {
      $array['persons'][] = array(       // [] for auto increment.
         'person' = array(
            '@id' =>  $person->getId(),
            '@type' =>  $person->getType(),
            '@age' =>  $person->getAge(),
         )
      )
    }
    

    然后您将使用

    获取每个人的信息
    $array['persons'][1] //for example.
    

    【讨论】:

    • 如果你想让你的数组有意义,那应该是$array['persons'][]
    • @EliasVanOotegem 无论哪种方式,我的看法都是有意义的。但我知道你来自哪里。谢谢。
    【解决方案3】:

    使用多维数组

    foreach($object->getPersons as $person) { 
       $array['persons'] = array(
          Array(
            'person' = array( '@id' => $person->getId(), '@type' => $person->getType(), '@age' => $person->getAge(), 
          ), 
          Array(
            'person' = array( '@id' => $person->getId(), '@type' => $person->getType(), '@age' => $person->getAge(), 
          ),
        ) 
      ) 
    }
    

    【讨论】:

      【解决方案4】:

      我建议,您将创建一个 xml,使用该值并直接创建 XML。使用SimpleXMLElement 这样做。您没有提供示例对象虚拟数据,所以我只是创建一个示例:

      $persons = array(
          (object) array('id' => 1, 'name' => 'Person 1', 'age' => 200, 'type' => 'H'),
          (object) array('id' => 2, 'name' => 'Person 2', 'age' => 300, 'type' => 'B'),
      );
      
      $count = count($persons);
      
      $xml = new SimpleXMLElement('<persons/>', LIBXML_NOEMPTYTAG);
      $xml->addAttribute('itc', $count);
      foreach($persons as $person) {
          $person_node = $xml->addChild('person', null);
          foreach($person as $attribute => $value) {
              $person_node->addAttribute($attribute, $value);
          }
      }
      
      echo htmlentities($xml->asXML());
      

      应该输出(基于虚拟数据):

      <?xml version="1.0"?>
      <persons itc="2">
          <person id="1" name="Person 1" age="200" type="H"/>
          <person id="2" name="Person 2" age="300" type="B"/>
      </persons>
      

      【讨论】:

      • 问题是,这将不是唯一属于已完成 XML 的对象。这只是一部分!
      • @Zwen2012 如果是这样的话它仍然可以,你最后仍然要创建一个xml,这只是我的例子。当然,你需要先构建数组,因为你没有给出一个例子,所以我只是做了一个虚拟数据
      • 你是对的,我尝试另一种方式,顺便说一句,你的例子工作正常!谢谢!
      • @Zwen2012 很高兴我能帮上忙
      猜你喜欢
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 2011-06-09
      相关资源
      最近更新 更多