在对象 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_push

您需要从数组中删除重复值,因此使用 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

中都填了选项