我有一个城市列表,这些城市可能存在一次或重复几次,或者根本不存在。
使用php,我要检查城市是否在foreach中,如果存在,则只打印一次输入。
以下作品完美,仅在存在时打印城市,但重复现有内容:
**Updated (added afterwards):**
$paradasarray= array();
$xml = new SimpleXMLElement($viajes);
foreach ($xml->parada as $excursion) {
$paradasObject = new stdClass();
$paradasObject->localidad = $excursion->localidad;
$paradasObject->localidad = str_replace('/<![CDATA[(.*)]]>/', '',
$paradasObject->localidad); $paradasarray[] = $paradasObject;
}
$paradasarray = json_encode($paradasarray); $paradasarray =
json_decode($paradasarray);
**end updated**
foreach ($paradasarray as $parada) {
if (strpos($parada->localidad, 'Benalmádena') !== false) {
echo '<option value="Benalmádena Costa">Benalmádena Costa</option>';
}
if (strpos($parada->localidad, 'Estepona') !== false) {
echo '<option value="Estepona">Estepona</option>';
}
}
我曾尝试过休息一下,或者我只在应该同时获得两个城市的情况下才得到两个城市之一,或者都不给。
答案 0 :(得分:2)
您需要从数组中删除重复的值,因此请使用localidad
获取数组的array_column()
列,并使用array_unique()
删除数组的重复值
$newParadasarray = array_unique(array_column($paradasarray, "localidad"));
因此您的代码应更改为
$newParadasarray = array_unique(array_column($paradasarray, "localidad"));
foreach ($newParadasarray as $parada) {
if (strpos($parada, 'Benalmádena') !== false)
echo '<option value="Benalmádena Costa">Benalmádena Costa</option>';
if (strpos($parada, 'Estepona') !== false)
echo '<option value="Estepona">Estepona</option>';
}
在demo中查看结果
更新:
我看到了完整的代码,因此您可以创建一个仅包含localidad
值的数组。并使用array_unique
轻松地从中删除重复的值。仅将底部代码添加到您的第一个循环(xml循环)中。
@$newParadasarray[] = $excursion->localidad;
并在这样的循环后删除重复的值
$newParadasarray = array_unique($newParadasarray);
然后遍历数组到打印选项
foreach ($newParadasarray as $parada) {
if (strpos($parada, 'Benalmádena') !== false)
echo '<option value="Benalmádena Costa">Benalmádena Costa</option>';
if (strpos($parada, 'Estepona') !== false)
echo '<option value="Estepona">Estepona</option>';
}
答案 1 :(得分:0)
简单
$cities = [];
foreach ($paradasarray as $parada) {
// If the current city is not in our array i.e. if it hasn't been printed
if (!in_array($parada->localidad, $cities)) {
// print then push
array_push($parada->localidad, $cities);
}
}
通过这种方式,您可以跟踪已经打印的所有城市。
但是,我实际上会在查询级别(如果涉及查询)对此进行修改,并从那里进行过滤。
阅读材料
答案 2 :(得分:0)
当存储2个不同的匹配项时,您可以写一个break
条件。声明$result
数组键的好处是,如果遇到重复的限定值,它将覆盖“ group”元素,而不是生成新元素。
代码:(Demo)
$paradasarray = [
(object)['localidad' => 'Estepona whatever'],
(object)['localidad' => 'something Benalmádena'],
(object)['localidad' => 'Benalmádena foo'],
(object)['localidad' => 'Estepona bar']
];
$result = [];
foreach ($paradasarray as $i => $parada) {
if (strpos($parada->localidad, 'Benalmádena') !== false) {
$result['Benalmádena'] = "Benalmádena Costa";
} elseif (strpos($parada->localidad, 'Estepona') !== false) {
$result['Estepona'] = 'Estepona';
}
if (count($result) == 2) {
break;
}
}
// you don't need to declare a value attribute if it matches the text
echo "<select>";
echo "<option>" , implode("</option><option>", $result) , "</option>";
echo "</select>";
无论匹配多少个元素,您都将得到:
0:select中有一个空的<option></option>
标签。
1:select中的单个填充选项
2:在选择中同时填写两个选项