2016-02-09 93 views
1

我目前正在尝试使用foreach从我的事件模型中使用关系返回所有地址。一切正常,返回所有地址,但会返回重复的结果。我尝试了array_unique,但不知道我的语法是否正确。从foreach返回唯一值

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

不要选择在第一名重复 - 你是如何查询数据库 – Steve

+0

这是我继承的代码,它没有得到的文档,是相当意大利面条一样,我会高兴地更改数据库的方式查询,但由于时间一分钟内的限制,我只是得到这个工作很重要。 它看着事件模型,并通过关系public function getAddressString(){ return $ this-> venue-> address-> building_name。 ','。 $ this-> venue-> address-> street_name。 ','。 $ this-> venue-> address-> city。 ','。 $这个 - > venue->地址 - > post_code; } 我不确定数据如何被拔出,但我知道该函数正在其他地方使用 – DevAL

回答

6

你应该array store technique尝试使用array_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'快得多。如果可能,我总是将唯一值存储为键而不是值。当然,OP应该试图让数据模型首先返回唯一的值。 –

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

php中的数组键在本质上是独一无二的,并且相当不错已知的秘密/快捷方式使用键来存储唯一值而不是值。 Php也具有像ksort等直接应用于键的功能。 –