![](/img/trans.png)
[英]I need to use a foreach loop on a json in php, but i only want to return unique values
[英]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.