将结果限制为对象foreach循环中的一个,in_array不起作用

时间:2018-10-29 09:36:15

标签: php object break strpos

我有一个城市列表,这些城市可能存在一次或重复几次,或者根本不存在。

使用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>';
    }
}

我曾尝试过休息一下,或者我只在应该同时获得两个城市的情况下才得到两个城市之一,或者都不给。

3 个答案:

答案 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);
    }
}

通过这种方式,您可以跟踪已经打印的所有城市。

但是,我实际上会在查询级别(如果涉及查询)对此进行修改,并从那里进行过滤。

阅读材料

array_push

答案 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:在选择中同时填写两个选项