2011-07-05 54 views
2

我有一個大的字符串數組看起來像這樣的:解釋PHP字符串變量

$xml->archdesc->accessrestrict->p 

這些字符串代表XML文檔中的可能的項目。 「$ xml」是我用simplexml_load_file()讀取XML文件時創建的對象(SimpleXMLElement)的簡寫。

我怎樣才能真正將這些解釋爲變量?我想訪問文檔中存在的每個字符串的值,但我似乎無法完成此操作。我試過使用$$格式,$ {}格式,eval()等,但似乎沒有給我變量的內容;他們只是將我的字符串顯示爲字符串。

這些對於使用對象操作符的東西不起作用嗎?我必須以某種方式逃避這些嗎?我錯過了什麼?

+0

順便說一句,很好的問題。雖然我想知道爲什麼有人會以這種方式存儲變量引用。似乎應該有更好的方式來完成你正在努力完成的任何事情。 – dqhendricks

+0

我這樣做是因爲它允許我遍歷XML元素列表並顯示完整的變量名稱以及當前是否有任何內容被分配給該變量以用於調試目的。比挖掘XML元素更容易看到,允許我按字母順序對它們進行排序等。 – jlk

+0

您是否知道您可以循環訪問simplexml元素,就像它們是數組一樣?或者甚至更好,使用XPath查詢,以便只能遍歷與XPath匹配的元素。 – dqhendricks

回答

0

eval適合我。

測試代碼:

$blah = new stdClass(); 
$blah->hello = 'hello'; 
$foo = '$blah->hello'; 
eval('echo '.$foo.';'); 
+0

結果是回聲'hello' – dqhendricks

+0

也,你肯定要小心評估用戶提交/外部內容,因爲它是一個巨大的安全漏洞。 – dqhendricks

0

您還可以使用可變變量來實現這一點,像這樣:

$blah = new stdClass(); 
$blah->hello = 'hello'; 
$foo = 'blah->hello'; 
$bar = explode('->', $foo); 
echo $$bar[0]->$bar[1]; 

通知您必須修剪美元符號的字符串的纔可以使用就這樣。

2

您可以將您的陣列更改爲xpath位置嗎?

$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><root><foo><bar>foobar</bar></foo><baz><boo>bazboo</boo></baz></root>"); 
$array = array('foo/bar', 'baz/boo'); 

foreach ($array as $xpath) { 
    $xpathResult = $xml->xpath($xpath); 
    echo $xpathResult[0]."\n"; 
} 

雖然我肯定更喜歡上面的解決方案,你可以保留現有的陣列和使用eval()(讀When is eval evil in php?

$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><root><foo><bar>foobar</bar></foo><baz><boo>bazboo</boo></baz></root>"); 
$array = array('$xml->foo->bar', '$xml->baz->boo'); 
foreach ($array as $xpath) { 
    echo eval("return $xpath;"); 
} 
+0

這是你應該嘗試的。 – dqhendricks

0

無需eval由其他答案的建議。只要做到以下幾點:

<? 
$x = 'hello'; 
$y = new StdClass; 
$z = 'y'; 
$y->hello = 'wes'; 
print $y->$x; 
print $z->$x; 
?> 
0

解決 - 我自己的愚蠢的錯誤;我在不同的地方重置了$ xml var,從而否定了我對SimpleXML對象的使用,再加上我的eval()語法有點偏離。愚蠢的錯誤,在這裏完全與我的問題無關。對於那個很抱歉。