繁体   English   中英

仅从foreach返回唯一值

[英]Return only unique values from foreach

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

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

您应该尝试使用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;;
}

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

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

如果您想过早地进行优化,则有一种更快的方法。

<?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

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

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

你可以试试这个-

<?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);

即使问题不同,我也同意史蒂夫的观点。 您应该调整查询。 它更快,更易读和可维护。 您不想做任何不需要做的事情。

如果我正确地收集了,您就必须关联表格。 大。 尝试这样的事情:

$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'命令,该命令的名称表示分组结果,并且仅返回唯一的结果。 请确保正确加上前缀(表名或别名),这取决于您使用的是什么。 希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM