【问题标题】:How to add keys and values to an array? [closed]如何将键和值添加到数组中? [关闭]
【发布时间】:2012-12-28 05:36:38
【问题描述】:

我正在使用以下代码来解析以下 xml,并将每个人的 id 添加为数组的键,并将他们的名称添加为数组的值。

代码正常工作,但数组不正常。

   $array = array();
   $category = $xml->xpath('descendant::person');
    foreach ($person as $p) {
    $array[$p['id']] = $p['name'];
    }
 <?xml version="1.0" encoding="utf-8"?>
 <people>
   <person name="Joe" id="134">
   <person name="Jack" id="267">
   </person>
   </person>

   <person name="Ray" id="388">
   <person name="John" id="485">
   <person name="Rayan" id="900">
   </person>
   </person>

   <person name="Alex" id="590">
   </person>
 </people>

XML 无效,但我无法使其有效。但是代码正在运行,我只需要将 id 和值分配给数组。

【问题讨论】:

  • 你的 xml 一点都不好,我认为应该是 &lt;person name="Joe" id="1"&gt;&lt;/person&gt;&lt;person name="Jack" id="2"&gt;&lt;/person&gt;&lt;person name="Ray" id="3"&gt;&lt;/person&gt;&lt;person name="John" id="4"&gt;&lt;/person&gt;&lt;person name="Alex" id="5"&gt;&lt;/person&gt;
  • 我从哪里来?不应该是id吗?
  • @MiqdadAli,代码是正确的,但我需要将它们放入数组中
  • @kennypu,是的,我的错字,已更正。
  • @Harry,对不起,我的 ID 是我的错字

标签: php arrays multidimensional-array simplexml


【解决方案1】:

这里发生了很多小问题......不过,最大的问题是您不能使用 simplexml 对象节点作为数组中的索引。它必须手动转换为字符串或整数。您最好稍微调整一下 xpath 表达式,并且您的循环不应该在 $person 上,这是一个不存在的变量,而是在 $category 上。试试这个作为替代方案:

$array = array();
$category = $xml->xpath('//person');
while(list( , $p) = each($category)) {
        $array[(string)$p['id']] = (string)$p['name'];
}
print_r($array);

另外请注意,如果您的 XML 不是有效的 XML,那么这很重要...... simplexml 库永远不会在无效的 XML 上正常运行(您示例中的 XML 有一些不正确的嵌套)。

【讨论】:

  • 感谢您的回答,当我添加演员表时它起作用了,但是当将其更改为 //person 时不起作用
  • 还有其他库可以用来解析这个无效的 xml 吗?
  • 即使您无法控制所获得的 XML,您也可以先将其整理好……使用 HTMLtidy 之类的东西。它至少会将其转换为 XML 解析器将在其上运行的格式。另一种可能性是使用 DOM 库及其 loadHTML() 方法……它不关心格式错误的 XML,然后您可以在其上运行 XPath。
  • 非常感谢您有任何示例或教程吗?有很多信息我不知道该选择哪一个
  • 可以试试这个问题:stackoverflow.com/questions/292926/…——它针对的是 HTML 处理,但这些方法也应该适合你。
【解决方案2】:

我不知道这是正确的方法,但我已经测试过这个方法并且它工作正常,

$xml = simplexml_load_string($response);
 $category = $xml->xpath('descendant::person');

 $array = array();

  foreach($category as $each){
    $name_obj = $each->attributes()->name[0];

     $name_json = json_encode($name_obj);
    $name_array = json_decode($name_json, TRUE);


    $id_obj = $each->attributes()->id[0];

  $id_json = json_encode($id_obj);
  $id_array = json_decode($id_json, TRUE);

  $array[$id_array[0]] = $name_array[0];
}

 print_r($array);

【讨论】:

    【解决方案3】:

    你确定 XML 不应该是这样的吗?:

    <?xml version="1.0" encoding="utf-8"?>
    <people>
        <person name="Joe" id="1"></person>
        <person name="Jack" id="2"></person>
        <person name="Ray" id="3"></person>
        <person name="John" id="4"></person>
        <person name="Alex" id="5"></person>
    </people>
    

    【讨论】:

    • 我是从 Web 服务中获取的,所以我无法更改它,但是代码成功运行,我唯一需要的是将人员的 id 设置为数组的索引及其名称作为数组的值。而且人的身份证不按顺序。
    • 嗨,id 不在顺序中,所以您可以按 id 获取数据顺序,然后 id 将按照正确的顺序或在 foreach 之前对数组 $person 进行排序
    • 这对设置数组索引有什么影响吗?我已经更新了问题
    • 现在您的 XML 无法验证(在您的原始帖子中)...
    • 没关系,因为我的代码有效,我只需要使用 id 作为数组的键等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多