Page 1 of 1

Помощь в написании udt array_unique

Posted: Mon Jan 12, 2015 11:05 pm
by halfdead18
Добрый день,

Нужно избавится от повторов в массиве.
есть одноуровневый массив $city, полученный так:
{cgsimple::get_page_content($child.alias,'city','city')}
затем мне нужно убрать из этого массива повторы и посчитать количество уникальных предметов в массиве.

В php это как то так:

$result = array_unique($city);

как это реализовать в smarty или через udt?

благодарю за помощь

Re: Помощь в написании udt array_unique

Posted: Tue Jan 13, 2015 1:24 pm
by guro
Попробуйте так

Code: Select all

{$city|@array_unique}

Re: Помощь в написании udt array_unique

Posted: Tue Jan 13, 2015 9:58 pm
by halfdead18
Работает, но только если в массиве названия городов написаны латиницей. Не работает в случае с кирилицей. Можно в smarty добавить локаль?

в php :

SORT_LOCALE_STRING - compare items as strings, based on the current locale.

Re: Помощь в написании udt array_unique

Posted: Tue Jan 13, 2015 10:14 pm
by guro
Попробуйте так

Code: Select all

{$city|@array_unique:SORT_LOCALE_STRING}
Если не сработает, то вот вам тег пользователя array_un

Code: Select all

$smarty = $template->smarty;
$smarty->assign($params['assign'], array_unique($params['array'],SORT_LOCALE_STRING));
и его вызов

Code: Select all

{array_un array=$city assign=city}

Re: Помощь в написании udt array_unique

Posted: Tue Jan 13, 2015 10:47 pm
by halfdead18
Большое спасибо за помощь. с кирилицей оказалось работает, я только вот с другой пролемой столкнулся.
т.к. {foreach} берёт значения городов с разных страниц, то я получаю не массив из скажем 7 городов, а сем массивов с 1 городом внутри каждого. Как сложить эти маленькие массивы в один?

я сделал так, но наверняка можно сделать проще:

{assign var='myArray' value=','|explode:"
{$cgsimple->get_children('kliniki',0,'children')}
{foreach from=$children item='child' name='childcount'}
{cgsimple::get_page_content($child.alias,'city','city1')}
{$city1},

{/foreach}
foo"}
{assign var='myArray1' value=$myArray|@array_unique}
{assign var='citycounter' value={count($myArray1)}}
{$citycounter}

В следствии чего, мне приходится потом отнимать единицу от count, т.к. город foo не существует на страницах.

Re: Помощь в написании udt array_unique

Posted: Fri Jan 16, 2015 11:15 am
by guro
Попробуйте так

Code: Select all

{assign var='myArray' value=','|explode:""}
{$cgsimple->get_children('kliniki',0,'children')}
 {foreach from=$children item='child' name='childcount'}
 {cgsimple::get_page_content($child.alias,'city','city1')}
  {assign var=newArr value=","|explode:$city1}
  {assign var=myArray value=$myArray|@array_merge:$newArr}
 {/foreach}
{assign var='myArray1' value=$myArray|@array_unique}
{assign var='citycounter' value={count($myArray1)}}
{$citycounter}