ограничить результат одним в цикле foreach объекта, in_array не работает - PullRequest
0 голосов
/ 29 октября 2018

У меня есть список городов, эти города могут существовать один раз или повторяться несколько раз, а могут и не существовать вообще.

С помощью 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 голосов
/ 29 октября 2018

Вам необходимо удалить дублирующее значение из вашего массива, чтобы получить 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>';
}

Результат проверки в демо


Обновление:

Я вижу ваш полный код, чтобы вы могли создать массив, содержащий только 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>';
}
0 голосов
/ 29 октября 2018

Вы можете записать условие break, когда сохранены 2 разных совпадения. Прелесть в объявлении ключей массива $result заключается в том, что если вы встретите дублирующее квалифицирующее значение, оно перезапишет элемент "group" вместо генерации нового элемента.

Код: ( Демо )

$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: пустой тег <option></option> в списке выбора.
1: одиночная, заполненная опция в select
2: оба заполненных варианта в select

0 голосов
/ 29 октября 2018

Просто

$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

...