仅返回来自foreach的唯一值

时间:2016-02-09 11:17:17

标签: php yii

我目前正在尝试使用foreach来使用我的事件模型中的关系返回所有地址。一切都很好,返回所有地址但会返回重复的结果。我尝试了array_unique,但不确定我的语法是否正确。

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

6 个答案:

答案 0 :(得分: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 :(得分:1)

您可以将每个唯一元素添加到新数组中,然后查看它们是否与in_array()一起存在:

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

答案 2 :(得分: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

答案 3 :(得分:0)

array_unique应该这样做。试试这个:

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

答案 4 :(得分: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);

答案 5 :(得分: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`'));

这里最重要的是'group'命令,它与名称一样,表示分组结果并返回唯一的结果。请确保正确添加前缀,表名称或别名,具体取决于您使用的内容。 希望它有所帮助。