2013-05-27 70 views
0

我想分配一個變量,如'heloo'到一個地址,如 - > system_settings-> settings-> hostname,我寫一個函數for.now當我寫手動地址這個函數可以正常工作,併爲該地址分配'hello',但是當我想動態地給出地址時它不起作用。 我的功能:如何分配一個變量到一個地址由php

<?php 
write_xml("->system_settings->settings->hostname",'Helloooooooo'); 
function write_xml($tag_address,$value) { 

    $xml = simplexml_load_file("test.xml") 
       or die("Error: Cannot create object"); 
    // $xml->system_settings->settings->hostname = $value; 
    $xml->$tag_address=$value; 
    $xml->asXML("test.xml"); 

} 
?> 

當我在命令行運行它的工作原理,但在動態模式下,它不工作,並確定在這行$ XML $ tag_address - > $ tag_address = $價值;作爲一個字符串,而不是一個地址。 我該怎麼辦? TNX

+0

爲什麼不「工作」?有什麼錯誤或什麼? – Voitcus

+0

當我手動給出地址並寫入$ xml-> system_settings-> settings-> hostname = $ value;它的工作原理和賦值給這個地址,但是當我給動態地址,如$ xml - > $ tag_address = $ value;它不會識別地址並將$ tag_address標識爲字符串。 –

+0

這不應該像'write_xml(「root-> system_settings-> settings-> hostname」,'Helloooooooo');'? (將'root'改爲最高級別的節點名稱) – Voitcus

回答

0

解決方案並不那麼容易。

最簡單的,但最安全的,就是用eval()功能,所以你可以寫這樣的事情:

eval('$xml'.$tag_address.' = $value;'); // note ' as quotation marks 

最正確的方法可以是你分割你的文字和手動創建一個鏈接的對象。你不能只引用一個字符串中的所有鏈接元素,但是你可以用一個元素一步一步地完成。

例如像

$splitted_text = explode('->', $tag_address); 
$node = $xml; 
foreach($splitted_text as $object) 
    $node = &$node -> {$object}; 
// at the moment $node = $xml->system_settings->settings->hostname 
$node = $value; 
$xml->asXML("test.xml"); 

應該工作。我還沒有對它進行測試,但是我們的想法是,在每次迭代中,您都準備$node變量更深入$xml變量。最後你只修改$node,但因爲對象只是引用,所以$xml應該相應地改變。

此示例假定在$tag_address開頭沒有->。如果是這樣,explode()函數會有問題,因爲這會創建空字符串作爲$splitted_text陣列的第一個元素。

所以,你可能需要刪除該空元素或應用調用作爲

write_xml("system_settings->settings->hostname",'Helloooooooo'); 

沒有第一->

+0

謝謝Voitcus,有沒有其他的解決方案,你建議我解決這個問題?這種方式是如此之好,但它重複XML文件的信息,如果有可能請你建議另一種方式.TNX –

+0

那麼,結構本身並不清楚。當你的'write_xml'函數打開,操作並關閉文件時,你無法從外部訪問。我個人會做一個函數來從文件返回XML對象,另一個來操縱(添加,刪除鍵等),最後一個保存並關閉。不是函數,但可能是對象方法。但是,如果你的程序只存儲主機名,這將是一個無用的努力。但對於你自己的問題,我沒有看到任何更好的解決方案(但不要說沒有任何解決方案);海事組織的其他所有成員都將對這兩者進行修改 – Voitcus

+0

好吧,我已經測試了它,在你的代碼中我們有$ node,在foreach之後它有地址,但它沒有,我打印了$ node,而我不是這個地址。 –

0

使用XPath選擇節點,然後更新該值。爲此,您需要適合您的標記地址的systax。

write_xml("system_settings/settings/hostname", 'Helloooooooo'); 

function write_xml($tag_address, $value) 
{ 
    $xml   = simplexml_load_file('test.xml') or die("Error: Cannot create object"); 
    $nodes  = $xml->xpath($tag_address); 
    $nodes[0][0] = $value; 
    $xml->asXML('test.xml'); 
} 
相關問題