php foreach带有变量

时间:2015-07-24 15:00:31

标签: php foreach simplexml

我正在尝试在foreach循环中使用变量(使用simplexml)但是对于如何使其正常工作感到困惑。

我的变量是:

$path="channel->item";

我希望我的foreach看起来像:

foreach ($xml->".$path." as $newsItem)

但这不起作用 - 就像$ path作为$ path而不是它的内容回应。

如果我这样做:

foreach ($xml->channel->item as $newsItem) 

工作正常 我确定这只是一个语法问题,但我无法弄清楚。提前谢谢。

2 个答案:

答案 0 :(得分:3)

您不能在变量变量中包含指针。

$members = explode('->', $path);
foreach($xml->{$members[0]}->{$members[1]} as $v) {

}

仅当您的路径保持二维时才会起作用。
[编辑] 如果你确实需要它以递归方式工作,你可以使用它。抱歉,我花了一分钟写下来:

function pathFinder($path, $obj) {
    $members = explode('->', $path);

    if(is_object($obj) && count($members) && property_exists($obj, $members[0])) {
        $nextMember = $members[0];
        array_shift($members);
        return pathFinder(implode('->', $members), $obj->{$nextMember});
    } else {
        return $obj;
    }
}

$xml = new stdClass;
$xml->channel->item[] = 'love';
$xml->channel->item[] = 'test';

$path = 'channel->item';
$array = pathFinder($path, $xml);
print_r($array);

输出:

Array(
    [0] => love
    [1] => test
)

答案 1 :(得分:2)

尝试这样的事情:

#Object for test
$xml = new stdClass();
$xml->channel->item[] = "banana";
$xml->channel->item[] = "abacate";
$xml->channel->item[] = "manga";
$xml->channel->item[] = "abacaxi";
$xml->channel->item[] = "morango";

list($channel, $item)= explode('->','channel->item');

foreach ($xml->{$channel}->{$item} as $newsItem) :
    var_dump($newsItem);
endforeach;