在对象 foreach 循环中将结果限制为一个,in_array 不起作用
limit result to one in object foreach loop, in_array does not work
我有一个城市列表,这些城市可能存在一次或重复多次,也可能根本不存在。
使用 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>';
}
}
我已经尝试过 break,但是或者当我应该得到两个城市时我只得到了两个城市之一,或者 none 个。
简单地说,
$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);
}
}
这样您就可以跟踪您已经打印的所有城市。
但是,我实际上会在查询级别修改它(如果涉及查询)并从那里过滤它们。
阅读Material
您需要从数组中删除重复值,因此使用 array_column()
获取数组的 localidad
列并使用 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>';
}
当存储了 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:在select
中都填了选项
我有一个城市列表,这些城市可能存在一次或重复多次,也可能根本不存在。
使用 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>';
}
}
我已经尝试过 break,但是或者当我应该得到两个城市时我只得到了两个城市之一,或者 none 个。
简单地说,
$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);
}
}
这样您就可以跟踪您已经打印的所有城市。
但是,我实际上会在查询级别修改它(如果涉及查询)并从那里过滤它们。
阅读Material
您需要从数组中删除重复值,因此使用 array_column()
获取数组的 localidad
列并使用 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>';
}
当存储了 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:在select