2012-12-20 194 views
6

的阵列我有一个数组名为$页内容如下:遍历对象

Array 
(
[01-about-us] => Page Object 
    (
     [_uri] => about-us 
     [_menuItem] => 01 
     [_visable] => 1 
    ) 

[02-contact] => Page Object 
    (
     [_uri] => contact 
     [_menuItem] => 02 
     [_visable] => 1 
    ) 

[_sitemap] => Page Object 
    (
     [_uri] => sitemap 
     [_menuItem] => 
     [_visable] => 
    ) 

[home] => Page Object 
    (
     [_uri] => home 
     [_menuItem] => 
     [_visable] => 1 
    ) 
) 

有通过一个简单的方法来循环并有性能获得页面的对象,即:

<?php foreach($pages->_visible() AS $p): ?> 
    <li> page </li> 
<?php endforeach ?> 
+0

您的意思是说您只想获取在这种情况下可见的对象? – Andris

+1

只需循环遍历数组,并在循环内部使用if语句来确定每个页面对象是否可见并且应该呈现列表元素。 –

+0

两件事情:1:你不一致拼写'可见'。 2:在数组中,您将'visable'称为字段,在'foreach'中称为方法。 –

回答

14

号你将不得不使用if

foreach ($pages as $page) { 
    if ($page->_visible == 1) { 
     echo "<li>page</li>"; 
    } 
} 

(还要注意你拼错visible在阵列中,也许是笔误)

+0

我认为输出中的前导下划线('_...')表示私有属性...尽管如此,我并没有在PHP上工作太多,所以我可能是错的。 –

+0

@FelixKling PHP有一个'private'关键字。我不知道我是否没有OP的“Page”类的类定义。他在自己的代码中使用它,所以我认为这是知道页面是否可见的方式。不过,它应该使用一种方法。 –

+0

完美的感谢,这只是一个拼写问题,我以为我疯了。 –

3

你只需要遍历网页阵列和循环访问内部类的对象属性:?

<?php foreach($pages as $k => $p): ?> 
    <?php if ($p->_visable === 1): ?> 
    <li><?php echo $k; ?></li> 
    <?php endif; ?> 
<?php endforeach; ?> 

请注意,visable的拼写错误,但多数民众赞成它是如何在你的问题

+0

为什么所有''标签? –

+0

因为多数民众赞成在目前这样做,是我理解所有关于最佳做法,但试图坚持他们目前的结构;) – PhearOfRayne

+2

当使用PHP作为模板语言,即嵌入到HTML的PHP​​,这种风格是更可读的IMO比其他任何东西。每个语句都以某种方式看起来像一个“标签”,因此更容易更好地发现/适合HTML,并且结构/流程更清晰。 –

6

或者你可以利用PHP的array_filter功能:

$pagesVisible = array_filter($pages, function($page) { 
    return (bool) $page->_visible; 
}); 

foreach ($pagesVisible as $key => $page) { 
    print '<li>' . $key . '</li>'; 
} 

或简写为:

$filter = function($page) { 
    return (bool) $page->_visible; 
}; 
foreach (array_filter($pages, $filter) as $key => $page) { 
    print '<li>' . $key . '</li>'; 
}