2017-04-06 101 views
1

我想创建一个严格基于此XML模板(结构)的多维数组:PHP动态多维数组

<invoice> 
    <type></type> 
    <transport></transport> 
    <items> 
     <item-ordered> 
      <name></name> 
      <quantity></quantity> 
     </item-ordered> 
    </items> 
</invoice> 

我是一个PHP新手,所以我尝试使用PHP的基本知识来解决它:

//This is from where I get all data for populating my XML/array structure 
$products = $params['order']->getProducts(); 
$prName = array_column($products, 'product_name'); 
$prQuantity = array_column($products, 'product_quantity'); 

//Populating arrays with data 
$item-ordered = array(); 
$items = array(); 
for($i = 0; $i < count($products); $i++) { 
    $item-ordered = array (   
     "name" => $prName[$i], 
     "quantity" => $prQuantity[$i] 
    ); 
    array_push($items,$item-ordered); //using a hyphen appears to be invalid 
) 

$invoice = array (
    "type" => "code:INVOICE", 
    "transport" => $customerTransport, 
    "items" => $items 
) 

但我尝试使用包括破折号(连字符)的变量/数组名称时遇到的问题。

所以我的第一个问题是我的解决方案是否正确。如果是这样,我想知道我该如何处理这个连字符问题。最终数组应该与上面显示的XML文件具有完全相同的结构,我无法更改XML文件本身。

+0

只是'$ item_ordered'? –

+3

PHP(以及具有类似c-派生语法的大多数常用语言)不允许在标识符中使用“-'字符。在PHP中,变量名称必须与'$ [0-9a-zA-Z _] +'类似。考虑如果你想对变量使用减法,如果它们的名字中有连字符,会发生什么。 – CollinD

回答

0

使用$ item_ordered作为变量名或任何其他名称,但不要使用普通的系列化与serialize($item_ordered)功能,你必须通过你的自我序列化阵列和写在你改变的方式XML根节点“item_ordered”为“item-ordered”...您可以在此链接http://php.net/manual/en/function.serialize.php#109953上查看PHP Array Serialization,或者简单地序列化它并使用str_replace更改序列化结果中的节点名称,以便代码看起来像像这样:

$item_ordered = array(); 
    $items = array(); 
    for($i = 0; $i < count($products); $i++) { 
     $item_ordered = array (   
      "name" => $prName[$i], 
      "quantity" => $prQuantity[$i] 
     ); 
     array_push($items, 
str_replace("item_ordered", "item-ordered", serialize($item_ordered)));  
    } 

    echo serialize($items); 
+0

谢谢你的回答,但我想我可以解决这个问题 - 我可以使用“键和值”符号创建数组 - 所以我可以像这样编写......“item-ordered”=> array(...) , 我对吗? 所以我需要知道它是否是posssible使用创建此阵列中的多个倍“密钥值”符号 - 在具有多于1个顺序的情况下 - 这样的: ' <项目排序> <项目有序> ' –

+0

欢迎您,是的,我有你的想法,你能做到这一点,你可以写一个新的代码来完成这项工作,或者你可以使用我已经写好的代码并节省你的时间:) –