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

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

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

一般

>注1

纽约

>注意2
>注3

波士顿

>注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访问它们,而不必担心订单)

最佳答案 虽然我猜测在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 – 希望有帮助吗?

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

点赞