2016-02-09 2 views
1

В настоящее время я пытаюсь использовать foreach, чтобы возвращать все адреса, используя отношение из моей модели событий. Все в порядке, возвращает все адреса, но вернет даже повторяющиеся результаты. Я попробовал array_unique, но не уверен, что у меня правильный синтаксис.Возвращать только уникальные значения из foreach

<?php 
    foreach ($data->events as $address) { 
     //array_unique($address, SORT_REGULAR); 
     echo $address->getAddressString() ."<br/> <br/>"; 
    } 
    ?> 
+0

Dont выбрать дубликаты в 1-е место - как вы запросов к базе данных – Steve

+0

Это код, который я унаследовал, он не получил документацию и довольно спагетти, как, я бы с удовольствием изменить, как запрашивается база данных, но из-за времени с ограничениями в минуту важно, чтобы я просто получил эту работу. Он смотрит на модель события и переходит к отношениям public function getAddressString() { возвращает $ this-> место-> address-> имя_создания. ','. $ this-> location-> address-> street_name. ','. $ this-> место-> адрес-> город. ','. $ This-> venue-> адресно> post_code; } Я не уверен, как еще данные выводятся, но я знаю, что функция используется в другом месте. – DevAL

ответ

6

Вы должны попробовать с помощью array store techniquearray_unique

// First Store data in $arr 
$arr = array(); 
foreach ($data->events as $address) { 
    $arr[] = $address->getAddressString(); 
} 
$unique_data = array_unique($arr); 
// now use foreach loop on unique data 
foreach($unique_data as $val) { 
     echo $val;; 
} 
+1

Этот ответ работает корректно, я собираюсь проверить его, добавив другой адрес. Редактировать. работает отлично. Удивительно, ура. – DevAL

0

array_unique должен это сделать. Попробуйте это:

<?php 
foreach (array_unique($data->events) as $address) { 
    echo $address->getAddressString() ."<br/> <br/>"; 
} 
?> 
+0

Ошибка: объект класса Событие не может быть преобразовано в строку. Я считаю это тем, что я пробовал в первую очередь. – DevAL

0

Вы можете добавить каждый уникальный элемент в новый массив, а затем увидеть, если они существуют с in_array():

$uniques = []; 
foreach($data->events as $address){ 
    if(!in_array($address->getAddressString(), $uniques)){ 
     $uniques[] = $address->getAddressString(); 
     echo $address->getAddressString()."<br><br>"; 
    } 
} 
+0

Слишком много вызовов функций. –

+0

'in_array' будет становиться все медленнее и медленнее по мере роста массива. Лучше сохранить значения в качестве ключей. Никаких вызовов функций не требуется, и гарантируется уникальность. Кстати, если вам нужно проверить, существует ли значение в массиве, 'array_key_exists' намного быстрее, чем' in_array'. Я всегда сохраняю уникальные значения как ключи, а не значения, если это возможно. Конечно, ОП должен попытаться заставить модель данных возвращать только уникальные значения в первую очередь. –

0

Вы можете попробовать это -

<?php 
    $all_addresses= array(); 
    foreach ($data->events as $address) { 
     $all_addresses[]= $address->getAddressString(); 
    } 
    $all_addresses= array_unique($all_addresses); 
    foreach($all_addresses as $val) { 
     echo $val . "<br/> <br/>"; 
    } 
?> 

Или

Вместо

foreach($all_addresses as $val) { 
     echo $val . "<br/> <br/>"; 
    } 

ли

echo implode('<br/> <br/>', $all_addresses); 
+0

Этот ответ не дал никаких результатов для меня в адресе. Я не уверен, что это моя реализация, поскольку она похожа на рабочий код, представленный разработчиком Php. – DevAL

0

Несмотря на то, вопрос был другим, я согласен со Стивом. Вы должны настроить свой запрос. Его более быстрый, читаемый и поддерживаемый. Вы не хотите делать то, что вам не нужно делать.

Если я правильно собрал, вы должны иметь таблицы, которые находятся в связи. Отлично. Попробуйте что-то вроде этого:

$var1 = YourModel::model() 
->with('address_table') 
->findAllByAttributes(array(-optional if you want certain columns-), 
        array('condition'=>'`type` LIKE :type AND `typeId` = :typeId AND `suggestionId` IS NULL', 'params'=>array(':type'=>$_GET['type'], ':typeId'=>$_GET['typeId']), 'group'=>'address_table.`column`')); 

Самое главное здесь для вас это команда «группа», которая, как следует из названия группы результаты и возвращает только уникальные. Убедитесь, что он правильно установлен, либо имя таблицы, либо псевдоним в зависимости от того, с чем вы работаете. Надеюсь, это поможет.

1

Существует более быстрый способ, если вы хотите преждевременно оптимизировать.

<?php 
    $arr = array(); 
    foreach ($data->events as $address) { 
     $arr[$address->getAddressString()] = 'a'; // value doesn't matter 
     // using inherent uniqueness of keys. 
    } 
    // $addrs = array_keys($arr); 
    // optionally, take all those array keys and put them in values. 
    // keys would become regular numeric keys 
    ?> 

Это должно работать быстрее, чем любые другие ответы здесь. Но это будет иметь значение, если вы имеете дело с большими объемами данных.

Если вы хотите эхо, вам нужно будет сделать array_keys, если вы не выше. Здесь он находится в одной строке:

echo implode(', ',array_keys($arr)); // comma separated list of unique values 

Или это для сортировки:

$addrs = array_keys($arr); 
sort($addrs); 
echo implode(', ',$addrs); // sorted list 

Наконец, я хотел бы добавить, что вы должны получать уникальные, упорядочивания результатов от вашей модели данных в первую очередь. База данных намного быстрее и эффективнее в простых задачах, таких как заказ уникальных результатов, чем когда-либо будет ваш PHP-код.

SELECT DISTINCT `address` FROM `table` 
WHERE `city` LIKE 'Lodi' 
ORDER BY 'address' ASC 
+0

Я не буду работать с большим количеством данных для этого конкретного экземпляра, но это, несомненно, пригодится, когда я экспортирую все это сразу. – DevAL

+1

Классы Array в php по своей сути уникальны, и это довольно хорошо известный секрет/ярлык, чтобы использовать ключи для хранения уникальных значений, а не значений. Php также имеет функции, такие как ksort и т. Д., Которые применяются непосредственно к ключам. –

Смежные вопросы