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

PHP/Smarty-如何检查数组中具有特定值的对象,并创建这些对象的临时数组,php,smarty,nested-lists,Php,Smarty,Nested Lists,第一次在这里,我希望我解释得足够好 PHP/Smarty,我正在处理页面的一个部分,该部分显示与常规页面或页面上各个位置相关的注释的项目符号列表。有些地方没有笔记。比如: 概述 附注1 纽约 附注2 附注3 波士顿 附注4 我将两个数组分配给正在使用的.tpl,并由UI类填充:$places和$notes $places包含place对象,每个对象按place\u id是唯一的 $notes包含唯一标识的note对象,每个note对象可能有或可能没有一个place\u id作为属性之

第一次在这里,我希望我解释得足够好

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

概述

  • 附注1
纽约

  • 附注2
  • 附注3
波士顿

  • 附注4
我将两个数组分配给正在使用的.tpl,并由UI类填充:$places和$notes

$places包含place对象,每个对象按place\u id是唯一的

$notes包含唯一标识的note对象,每个note对象可能有或可能没有一个place\u 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}
{if(**任何票据存在于$NOTES中,没有位置_id**)}
    一般的 {foreach-from=**[没有位置的注释\u-id]**item=note}
  • $note->get\u text()
  • {/foreach}
{else}
    一般的
{/if} {foreach from=$places item=place} {assign var=curr\u place\u id value=$place->get\u id()} {如果(**存在于$NOTES中的任何NOTES,其中place\u id==$curr\u place\u id**)}
    {$place->get_name()} {foreach from=**[NOTES WHERE place\u id==$curr\u place\u id]**item=note}
  • $note->get\u text()
  • {/foreach}
{else}
    {$place->get_name()}
{/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-如果希望在旧版本上运行此函数,请将该函数移动到它自己的命名函数并使用回调类型)

然后,在places循环中使用isset($notes\u places.$curr\u place\u id)可以轻松循环两个数组,以确定该位置是否有注释

另外,您忘记了get_text()调用中的{}

我很快就准备了一个样品,可以在:-找到,希望有帮助


顺便说一句:你的问题很清楚,并且解释了你想做什么,甚至详细说明了你在做什么时的决定,虽然这不是很明显——所以这是第一次:很好的问题

谢谢你,坎德,有道理。今天早上我要试一试。效果很好。仅供参考,我在PHP中使用了foreach而不是arrayfilter..只是无法让arrayfilter工作。非常感谢你的帮助。