2012-03-27 4 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 />'; 
} 

и получить доступ к массиву $xml_array через массив $items. Есть ли способ сделать это и не использовать 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. –

+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]]; } ' –

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_ он отвечает , вопрос значительно улучшит его долгосрочное значение . Пожалуйста, отредактируйте свой ответ, чтобы добавить какое-то объяснение. –

Смежные вопросы