Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用多维数组形成XML子节点的路径_Php_Xml_Multidimensional Array - Fatal编程技术网

Php 如何使用多维数组形成XML子节点的路径

Php 如何使用多维数组形成XML子节点的路径,php,xml,multidimensional-array,Php,Xml,Multidimensional Array,我从哪里开始。。。XML文件需要进入数据库。因此,我想创建一个配置数组,其中包含一个表的XML节点和表列之间的映射 $maps = array( // 'node-name'=>'column-name' 'prod_id'=>'supplier_product_id', 'description'=>'product_description', ); $xml=simplexml_load_file($file); //just a test foreach ($m

我从哪里开始。。。XML文件需要进入数据库。因此,我想创建一个配置数组,其中包含一个表的XML节点和表列之间的映射

$maps = array(
 // 'node-name'=>'column-name'
 'prod_id'=>'supplier_product_id',
 'description'=>'product_description',
);

$xml=simplexml_load_file($file);

//just a test
foreach ($maps as $node => $col){
 echo 'node ' . $xml->$node . ' is mapped to: ' . $col; //this works
}
我需要在同一个表中输入来自子节点的信息。因此,我考虑将子节点放入一个嵌套数组中,如下所示:

$maps = array(
 // 'node-name'=>'column-name'
 'prod_id'=>'supplier_product_id',
 'description'=>'product_description',
 // to access $xml->node->subnode;
 'category'=>array(
  'id'=>'category_id',
 ),
);
但现在我感到困惑了,我如何使用嵌套数组创建到节点的路径,如下所示: $xml->category->id

我是一个PHP新手,希望能得到一些帮助,让我继续前行。 欢迎所有帮助,提前谢谢。

尝试以下方法:

<?php
$maps = array(
 // 'node-name'=>'column-name'
 'prod_id'=>'supplier_product_id',
 'description'=>'product_description',
 // to access $xml->node->subnode;
 'category'=>array(
  'id'=>'category_id'
 )
);

function getDataMapping( $maps, $child="" ) {
    global $file;

    $xml=simplexml_load_file($file);

    foreach ($maps as $node => $col) {
        if( is_array( $col ) ) {
            getDataMapping( $col, $node );
        } else {
            if( $child ) {
                echo 'node ' . $xml->{$child}->$node . ' is mapped to: ' . $col; //this works
            } else {
                echo 'node ' . $xml->$node . ' is mapped to: ' . $col; //this works
            }
        }
    }
}

getDataMapping( $maps );
?>
显然,如果嵌套在数组中运行多层深度数组等,则可以将其更改为递归函数

希望这有帮助。

以下是XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<message>
<errorcode>100</errorcode>
<body>
 <jobs>
  <job>
   <id>1</id>
   <description>Nice job at the office</description>
   <hours>40</hours>
   <contact>
    <id>SYL</id>
    <name>Sylvia</name>
    <email>sylvia@mail.com</email>
   </contact>
  </job>
  <job>
   <id>2</id>
   <description>Construction work</description>
   <hours>32</hours>
   <contact>
    <id>HEN</id>
    <name>Hendrik</name>
    <email>hendrik@mail.com</email>
   </contact>
  </job>
 </jobs>
</body>
<attachements>
</attachements>
<filenames>
</filenames>
</message>

我只是意识到实际上没有必要阅读超过两个级别的内容。所以您的答案就足够了,因为它可以访问$xml->node和$xml->child->node。使用xpath“//job”,我可以为所有节点设置一个基本节点入口,并对它们进行迭代。

谢谢@Pushpesh!递归函数是我感兴趣的,但我还不知道怎么做。。。我的问题是如何用正确的语法构建一个句子来访问子节点的值。在子节点上的所有节点名称都可以存储在一个数组中。但是如何用“箭头”->“将其写回以再次形成正确的语法呢?像这样:$xml->{$node}->{subnode}->{subsubnode}->{subsubsubnode}你看到我的整个问题了吗,因为我太早按Enter键了,你已经回答了?我认为语法还不正确。如果有sub-sub-child,字符串也必须拉伸这个数量的子child,得到:$xml->{child}->{subchild}->{subsubchild}或者我需要另一种方法吗?好的,我上面给你的是一个有效的模板。如果您愿意向我展示您正在使用的XML文件,它将在很大程度上帮助我为您提供永久解决方案。否则,这就像在黑暗中射击!!我只是意识到实际上没有必要阅读超过两个级别的内容。所以您的答案就足够了,因为它可以访问$xml->node和$xml->child->node。使用xpath“//job”,我可以为所有节点设置一个基本节点入口,并对它们进行迭代。