2012-03-27 117 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