2017-04-06 117 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

歡迎您,是的,我有你的想法,你能做到這一點,你可以寫一個新的代碼來完成這項工作,或者你可以使用我已經寫好的代碼並節省你的時間:) –