PHP / Smarty - 如何检查数组中是否有具有特定值的对象,并创建这些对象的临时数组

时间:2010-07-17 01:47:29

标签: php smarty nested-lists

这里的第一个计时器,我希望我能够解释得这么好......

PHP / Smarty,我正在处理页面的一部分,该部分显示与常规页面或该页面上的各个位置相关联的注释的项目符号列表。有些地方没有笔记。类似的东西:

常规

  • note 1

纽约

  • note 2
  • note 3

波士顿

  • note 4

我有两个分配给.tpl的数组我正在使用并填充UI类:$ places和$ notes

$ places 包含place对象,每个对象都由place_id

唯一

$ notes 包含唯一标识的注释对象,每个注释对象可能有也可能没有place_id作为其中一个属性

这就是我的想法:

{if (**ANY NOTES EXIST IN $notes WITH NO place_id**)}
    <ul id="list-general">
        <h4>General</h4>
        {foreach from=**[NOTES WITH NO place_id]** item=note}
            <li id="note-{$note->get_id()}">$note->get_text()</li> 
    {/foreach}
    </ul>
{else}
    <ul id="list-general" class="hide">
        <h4>General</h4>
    </ul>
{/if}

{foreach from=$places item=place}
     {assign var=curr_place_id value=$place->get_id()}
     {if (**ANY NOTES EXIST IN $notes WHERE place_id == $curr_place_id**)}
     <ul id="list-{$curr_place_id}">
             <h4>{$place->get_name()}</h4>
             {foreach from=**[NOTES WHERE place_id == $curr_place_id]** item=note}
                 <li id="note-{$note->get_id()}">$note->get_text()</li> 
         {/foreach}
         </ul>
     {else}
        <ul id="list-{$curr_place_id}" class="hide">
            <h4>{$place->get_name()}</h4> 
        </ul>
     {/if}
{/foreach}

我对这一切都很陌生,而且我很难处理 CAPS 中的项目...所以,我的问题是:什么是评估属性的最佳方法两个不同数组中的对象,并可能构建仅包含我需要的注释的临时数组。

(如果您想知道,我正在创建隐藏节点,以便我可以通过javascript访问它们而不必担心订单)

1 个答案:

答案 0 :(得分:2)

虽然我猜测可以在Smarty中执行此操作,但似乎您在这里混合了业务逻辑和表示逻辑。就个人而言,我会考虑在调用此模板的PHP中将数组拼接成两部分(一般和地点)。

$placesNotes = array();
$generalNotes = array();

array_filter($notes, function($note) {
    global $placesNotes, $generalNotes;
    if($note->get_place_id() == null) {
        $generalNotes[] = $note;
    } else {
        $placesNotes[$note->get_place_id()][] = $note;
    }
});

(注意:这使用匿名函数,因此只有> 5.3 - 如果你想在旧版本上运行它,将函数移动到它自己的命名函数并使用Callback类型)

然后你最终得到两个你可以轻松循环的数组,在Places循环中使用isset($ notes_places。$ curr_place_id)找出这个地方是否有任何音符。

另外,你忘记了get_text()调用周围的{}。

我已经发了一个快速的样本,可以在http://gist.github.com/479392找到 - 希望有帮助吗?

顺便说一句:你的问题非常明确,并解释了你想要做什么,甚至详细说明你所做的事情背后的决定,当时不是很明显 - 所以这是第一次:优秀的问题!