如何通过php将变量分配给地址

时间:2013-05-27 07:32:34

标签: php variables assign memory-address

我希望将诸如'heloo'之类的变量分配给地址,例如 - > system_settings-> settings-> hostname,然后我写一个函数for.now当我手动编写该地址时,此功能正常工作,将'hello'分配给该地址,但是,当我想动态地给出地址时,它不起作用。 我的职责:

<?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");

}
?>

当我运行命令行时它可以工作,但在动态模式下它不起作用并在此行中标识$ tag_address $ xml-&gt; $ tag_address = $ value;作为字符串,而不是地址。  我该怎么办? TNX

2 个答案:

答案 0 :(得分: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');

没有第一个->

答案 1 :(得分: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');
}