2012-03-11 42 views
0

任何人都可以幫助解釋爲什麼以下情況會返回重複數據嗎?在SimpleXML對象上使用xPath對foreach循環返回重複數據

<?php 
$xml_test = '<array key="results"> 
    <array key="123"> 
     <string key="mask">1234</string> 
    </array> 
    <array key="987"> 
     <string key="mask">5678</string> 
    </array> 
</array>'; 

$load_test = simplexml_load_string($xml_test); 

foreach ($load_test as $array) 
{ 
    $mask = $array->xpath('//string[@key="mask"]'); 

    print 'Mask: ' . $mask[0] . '<br />'; 
} 

返回:

Mask: 1234 
Mask: 1234 

如果我foreach循環中拋出的print_r($陣列),我得到:

SimpleXMLElement Object 
(
    [@attributes] => Array 
     (
      [key] => 123 
     ) 

    [string] => 1234 
) 
Mask: 1234 

SimpleXMLElement Object 
(
    [@attributes] => Array 
     (
      [key] => 987 
     ) 

    [string] => 5678 
) 
Mask: 1234 

這到底是怎麼回事?爲什麼當我使用xPath表達式時,當兩個$數組顯然沒有保存重複數據時,我會得到重複的掩碼。

回答

3

您正在對XML中的每個<array>節點進行兩次相同的xpath查詢。不需要外部循環。只要執行你的xpath查詢,然後遍歷它的結果。

$mask = $array->xpath('//string[@key="mask"]'); 
print 'Mask: ' . $mask[0] . '<br />'; 
print 'Mask: ' . $mask[1] . '<br />'; 

還是做XPath查詢第一,然後遍歷它:

$mask = $array->xpath('//string[@key="mask"]'); 
foreach ($mask as $m) { 
    echo $m; 
} 
+0

謝謝見,但我仍然感到困惑,其中重複的數據是從哪裏來的。每個循環中的$ array仍然包含整個XML結構?和print_r是隱藏它或什麼的? – 2012-03-11 05:05:08

+0

我首先進行xpath查詢的問題是,我想要在每個數組節點上執行多個xpath查詢,以便不僅匹配掩碼,而且還匹配鍵:id,名稱和電子郵件。 – 2012-03-11 05:14:06

+1

@MichaelP沒有重複的數據 - 只是因爲你的xpath查詢以'//開頭',每次你在循環中執行它時,你都會得到完全相同的返回的節點列表。所以每個循環迭代的值'$ mask [0]'是相同的。 – 2012-03-11 12:52:53

0

直到我可以更好地瞭解發生了什麼事情,下面的輸出,我所追求的;允許我匹配關鍵屬性。

$xml_test = '<array key="results"> 
    <array key="123"> 
     <string key="mask">1234</string> 
     <string key="name">mick</string> 
    </array> 
    <array key="987"> 
     <string key="mask">5678</string> 
     <string key="name">bob</string> 
    </array> 
</array>'; 

$simplexml= new SimpleXMLElement($xml_test); 

$test = $simplexml->xpath('//array/array'); 

$loop = 0; 
foreach ($test as $result) 
{ 
    $mask = $result->xpath('//string[@key="mask"]'); 
    $name = $result->xpath('//string[@key="name"]'); 

    echo "Mask: " . $mask[$loop] . '<br />'; 
    echo "Name: " . $name[$loop]; 
    $loop++; 
} 

返回:

Mask: 1234 
Name: mick 

Mask: 5678 
Name: bob 

不知道如何清理上面的是,但它最終做什麼,我需要做的。