2012-03-27 97 views
2

我已經將XML路徑存儲到字符串中的項目,如下所示:response->items->item基於變量字符串訪問php多維數組鍵

我需要做的是訪問數組名爲$ xml_array這樣的:

$ xml_array [ '響應'] [ '項目'] [ '項目']

當我把它寫在它的工作原理。事情是,我希望它在飛行中完成。

我用這個轉換response->items->item['response']['items']['item']

$xml_path = 'response->items->item'; 
$explode_path = explode('->', $xml_path); 
$correct_string = false; 

foreach($explode_path as $path) { 
    $correct_string .= '[\''.$path.'\']'; 
} 

的問題是,我不能這樣做訪問$xml_array$xml_array[$correct_string]

所以我結束了這一點:

$xml_tag = 'title'; 
$xml_path = 'response->items->item'; 

$correct_string = '$items = $xml2array'; 

$explode_path = explode('->', $xml_path); 

foreach($explode_path as $path) { 
    $correct_string .= '[\''.$path.'\']'; 
} 
$correct_string .= ';'; 

eval($correct_string); 
foreach($items as $item) { 
    echo $item[$xml_tag].'<br />'; 
} 

並通過$items數組訪問$xml_array數組。有什麼辦法可以做到這一點,並避免使用eval()?

在此先感謝!

回答

3
$xml_tag = 'title'; 
$xml_path = 'response->items->item'; 

$explode_path = explode('->', $xml_path); 

$items = $xml2array[$explode_path[0]][$explode_path[1]][$explode_path[2]]; 

foreach($items as $item) { 
    echo $item[$xml_tag].'<br />'; 
} 
+0

非常感謝您的支持!如果我想自動生成$ items變量而不是手動編寫$ explode_path [0]等,該怎麼辦?畢竟我會從MySQL中檢索這個。 – 2012-03-27 07:23:43

+2

好了:'$ explode_path = explode(' - >',$ xml_path); $ count_explode = count($ explode_path); $ items = $ xml2array; for($ i = 0; $ i <$ count_explode; $ i ++){ \t $ items = $ items [$ explode_path [$ i]]; } – 2012-03-27 07:28:18

6

我真的很高興你的目標是停止使用eval()。 :-)

如果我正確地理解了你,你有一個$items的數組,你試圖根據$xml_path的內容找到它。

我明顯沒有對您的數據進行過測試,但是這樣的事情呢?

<?php 

$xml_path = 'response->items->item'; 

$explode_path = explode('->', $xml_path); 

foreach($items as $item) { 
    $step = $item; 
    foreach($explode_path as $path) { 
    $step = $step[$path]; 
    } 
    echo $step . '<br />'; 
} 

的想法是,每個$項目,你一步通過爆炸路徑,縮小搜索範圍,當您去通過細化$step也許是某種未知的深度。

這當然假定對於任何$ xml_path的值,都會在$ items數組中設置相應的項目。否則,你會想添加一些錯誤處理。 (無論如何,您可能都需要錯誤處理。)

0
$array = []; 
    foreach($items as $item) { 
     $inputs[] = [ 
      $item->name => $item->value 
     ]; 
    } 
+1

雖然這段代碼可能會回答這個問題,但提供 關於_why_和/或_how_的其他上下文會回答 這個問題會顯着改善它的長期 值。請[編輯]你的答案,添加一些解釋。 – 2016-05-31 12:08:14