2010-07-17 6 views
4

Первого таймера здесь, я надеюсь, что объяснить это достаточно хорошо ...PHP/Smarty - Как проверить массив для объектов с определенными значениями, и создать временный массив этих объектов

PHP/Smarty, я m работает над разделом страницы, на котором отображаются списки маркеров заметок, связанных либо с общей страницей, либо с отдельными местами на этой странице. В некоторых местах нет заметок. Что-то вроде:

Общие

  • примечание 1

Нью-Йорк

  • примечание 2
  • примечание 3

Boston

  • примечание 4

У меня есть два массива, присвоенных .TPL я работаю и населённый класс UI: $ место и $ нота

$ places содержит предметы, каждый из которых уникален place_id

$ примечания содержит однозначно определены объекты нотные, каждый из которых может или не может быть 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 ... так что мой вопрос: как лучше всего оценить атрибуты объектов в двух разных массивах и, возможно, создать временные массивы которые содержат только те примечания, которые мне нужны.

(В случае, если вам интересно, я создаю скрытые узлы, так что я могу получить доступ к ним через яваскрипт и не придется беспокоиться о заказе)

ответ

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 только - если вы хотите, чтобы это работать на старых версиях, переместить функцию, чтобы она владеет именем функции и использовать тип обратного вызова)

You то в итоге с двумя массивами вы легко переходите в цикл, используя isset ($ notes_places. $ curr_place_id) в цикле Places, чтобы узнать, есть ли в нем какие-либо заметки.

Кроме того, вы забыли {} в вызовах get_text().

Я подбил быстрый образец, который можно найти по адресу: http://gist.github.com/479392 - надеюсь, что это поможет?

BTW: Ваш вопрос был очень ясным и объяснил, что вы хотите сделать, даже детализируя решение, стоящее за тем, что вы делали, когда это было не сразу очевидно - так что в первый раз: отличный вопрос!

+0

спасибо kander, имеет смысл. Я дам ему выстрел сегодня утром. – byron

+0

работает как шарм. FYI, я использовал foreach в PHP вместо arrayfilter. Просто не смог заставить arrayfilter работать. большое спасибо за вашу помощь. – byron

+0

Добро пожаловать :) – kander