Search code examples
phparrayswhitespacetrim

Remove leading and trailing whitespace characters from each element of an array


Here is my loop:

$max = sizeof($cityArray);
        $cityArray = array_unique($cityArray);
        $cityArray = array_merge($cityArray);
        for ($i=0; $i<$max; $i++) {
            if($cityArray[$i] != ""){
                //echo $cityArray[$i].",";  
                       echo "<option value='$cityArray[$i]'>$cityArray[$i]</option>";   
            }
        }

I have this array of citys ($cityArray):

Arcadia,San Diego,Goleta,San Bernardino,San Bernardino ,Oak View,Santa Barbara,Rancho Cucamonga,Lebec,Frazier Park,Oxnard,Valencia,Pine Mtn Club,Torrance,Oxnard,Orange,Pasadena,Norwalk,West Covina,Reseda,Signal Hill,Chino Hills,San Luis Obispo,San Luis Obispo,Fountain Valley,San Luis Obispo,Lebec,Summit Valley,San Bernardino,Chino,Victorville,Upland,Lake Arrowhead,Lucerne Valley,Fawnskin,Forest Falls,San Diego,San Diego,San Diego,Santa Ana,Fountain Valley,Laguna Niguel,Mt. Laguna,Solana Beach,Corona,Ramona,San Diego,Irvine,Saugus,Silverado,Huntington Beach,Mission Viejo,Tustin,Brea,Pine Valley,Mission Viejo,San Diego,Fullerton,Lake Elsinore,San Diego,Mt. Laguna,Lancaster,Lytle Creek,Mentone,Palmdale,Edwards AFB,Ramona,Palmdale,Rancho Cucamonga,Lytle Creek,San Bernardino,Mentone,Lytle Creek,Torrance,Vista,Yorba Linda,Littlerock,Riverside,Santa Clarita,Bakersfield,Azusa,Canyon Country,Hesperia,Azusa,Castaic,Chino Hills,Los Angeles,Northridge,Los Angeles,Tarzana,Montclair,Pasadena,Arcadia,Riverside,Sunland,Burbank,Banning,Glendora,Cerritos,Torrance,West Hills,Los Angeles,Valencia,Marina Del Rey,Torrance,Manhattan Beach,La Canada,Corona,San Bernardino,Anza,Mt Baldy,La Canada,Leona Valley,Northridge,Canyon Country,Pearblossom,Solana Beach,Ranch Bernardo,Whittier,Tujunga,Cerritos,San Diego,Fallbrook,Westminster,El Cajon,Running Springs,Long Beach,Palmdale,Costa Mesa,Porter Ranch,Castaic,Hawthorne,Littlerock,Arcadia,San Diego,Orange,Anaheim,El Toro,Moreno Valley,Paso Robles,Escondido,Atascadero,Capitola,Murrieta,Temecula,San Diego,Tustin,Costa Mesa,Hemet,Rancho Santa Margarita,La Habra,Corona,San Bernardino,Capistrano Beach,Brea,Irvine,San Diego,Riverside,Anaheim,Buena Park,Huntington Beach,Arcadia,Palmdale,Burbank,Palmdale,Saugus,Fontana,Lakeview Terrace,Oceanside,Azusa,Bakersfield,Fawnskin,Saugus,Canoga Park,San Diego,Los Angeles,Torrance,Castaic,Frazier Park,Palm Desert,Azusa,Angelus Oaks,Lucerne Valley,Palm Desert,Palm Springs,Redlands,Fontana,Azusa,Ridgecrest,Bell,Palmdale,Pearblossom,San Dimas,Bell Gardens,Alhambra,Encino,Pomona,Los Angeles,Chula Vista,Simi Valley,Long Beach,Thousand Oaks,El Segundo,Northridge,Studio City,Salinas,Monterey Park,Culver City,Paso Robles,Lompoc,Santa Maria,San Luis Obispo,Santa Barbara,Ventura,Pasadena,Rowland Heights,Van Nuys,Valencia,Santa Monica,Lancaster,Burbank,Granada Hills,Oxnard,Downey,El Monte,Lakewood,Pico Rivera,Costa Mesa,Riverside,Maricopa,Big Bear Lake,Idyllwild,Big Bear Lake,Big Bear Lake,Frazier Park,Trabuco Canyon,Acton,Wrightwood,Frazier Park,Wrightwood,Descanso,Lake Arrowhead,Wrightwood,Mt Baldy,Crestline,Wrightwood,Wrightwood,Mount Wilson,Forest Falls,Lake Arrowhead,Lake Arrowhead,Glendora,Chula Vista,Redlands,Big Bear Lake,Encinitas,Escondido,Corona,Canyon Country,Fontana,Campo,Oceanside,San Diego,Yucca Valley,Palm Desert,Long Beach,Irvine,Chula Vista,Ramona,Idyllwild,Big Bear Lake,Encinitas,Pine Valley,Rancho Cucamonga,New Cuyama,Mountain Center,Lake Hughes,Arcadia,Big Bear Lake,Agua Dulce,Mt Baldy,Fontana,Spring Valley,Imperial Beach,Long Beach,Glendale,Cedar Glen,Kearny Mesa,San Marcos,Big Bear Lake,Huntington Beach,Azusa,Los Angeles,Fontana,Azusa,Running Springs,Upland,Chino Hills,Oceanside,Foothill Ranch,Azusa,Alpine,Santa Monica,Temecula,Jacumba,Pismo Beach ,Los Angeles,Santa Ana,Sierra Madre,Hesperia,Green Valley,Ojai,Alpine,Santa Margarita,Thousand Oaks,Big Bear City,Julian,El Segundo,Wrightwood,Big Bear Lake,Chula Vista,Hemet,San Marcos,Running Springs,Running Springs,San Pedro,Laguna Hills,La Quinta,Carson,Chino,La Puente,Reseda,Lake Elsinore,Fawnskin,Santa Maria,San Diego,Murrieta,Camarillo,Palmdale,Big Bear Lake,Upland,Bakersfield,Julian,San Bernardino,Big Bear Lake,Descanso,Fawnskin,Big Bear Lake,Alpine,Lake Elsinore,Mira Loma,Inglewood,Temecula,Atascadero,Apple Valley,Westlake,Palm Desert,Twin Peaks,Phelan,Rancho Cucamonga,Blue Jay,Palomar Mountain,Big Bear Lake,Phelan,Lake Arrowhead,Los Angeles,Los Angeles,Banning,Los Olivos,Big Bear Lake,La Mesa,Menifee,Big Bear Lake,Covina,Monterey Park,Ventura,Huntington Park,Perris,Fontana,Fillmore,Blue Jay,Lytle Creek,Big Bear Lake,Azusa,Rim Forest,Beaumont,Idyllwild,Big Bear Lake,Santa Clarita,Phelan,Cedar Glen,Pasadena,Hemet,Palmdale,Moreno Valley,Frazier Park,San Bernardino,Summit Valley,Frazier Park,Fawnskin,Mount Wilson,Big Bear Lake,Running Springs,Mountain Center,Santa Ynez,Azusa,Mt Baldy,Rimforest,Running Springs,Big Bear Lake,Crestline,Santa Ynez,Big Bear Lake,Big Bear Lake,Idyllwild,Alhambra,Lake Elsinore,Azusa,Los Angeles,Hesperia,Idyllwild,Big Bear Lake,Lake Arrowhead,Big Bear Lake,Big Bear Lake,Canyon Country,Azusa,Sunland,Santa Barbara,Topanga,San Fernando,Glendora,Acton,Corona,Ramona,Alpine,King City,Santa Maria,Santa Barbara,Ojai,Frazier Park,Lytle Creek,Mentone,Idyllwild

I am trying to get rid of duplicates, so I run array_unique($cityArray) and I find I must run array_merge($cityArray) to reset the array count to 0 (but I still get unset offset after my array...):

Arcadia,San Diego,Goleta,San Bernardino,San Bernardino ,Oak View,Santa Barbara,Rancho Cucamonga,Lebec,Frazier Park,Oxnard,Valencia,Pine Mtn Club,Torrance,Orange,Pasadena,Norwalk,West Covina,Reseda,Signal Hill,Chino Hills,San Luis Obispo,Fountain Valley,Summit Valley,Chino,Victorville,Upland,Lake Arrowhead,Lucerne Valley,Fawnskin,Forest Falls,Santa Ana,Laguna Niguel,Mt. Laguna,Solana Beach,Corona,Ramona,Irvine,Saugus,Silverado,Huntington Beach,Mission Viejo,Tustin,Brea,Pine Valley,Fullerton,Lake Elsinore,Lancaster,Lytle Creek,Mentone,Palmdale,Edwards AFB,Vista,Yorba Linda,Littlerock,Riverside,Santa Clarita,Bakersfield,Azusa,Canyon Country,Hesperia,Castaic,Los Angeles,Northridge,Tarzana,Montclair,Sunland,Burbank,Banning,Glendora,Cerritos,West Hills,Marina Del Rey,Manhattan Beach,La Canada,Anza,Mt Baldy,Leona Valley,Pearblossom,Ranch Bernardo,Whittier,Tujunga,Fallbrook,Westminster,El Cajon,Running Springs,Long Beach,Costa Mesa,Porter Ranch,Hawthorne,Anaheim,El Toro,Moreno Valley,Paso Robles,Escondido,Atascadero,Capitola,Murrieta,Temecula,Hemet,Rancho Santa Margarita,La Habra,Capistrano Beach,Buena Park,Fontana,Lakeview Terrace,Oceanside,Canoga Park,Palm Desert,Angelus Oaks,Palm Springs,Redlands,Ridgecrest,Bell,San Dimas,Bell Gardens,Alhambra,Encino,Pomona,Chula Vista,Simi Valley,Thousand Oaks,El Segundo,Studio City,Salinas,Monterey Park,Culver City,Lompoc,Santa Maria,Ventura,Rowland Heights,Van Nuys,Santa Monica,Granada Hills,Downey,El Monte,Lakewood,Pico Rivera,Maricopa,Big Bear Lake,Idyllwild,Trabuco Canyon,Acton,Wrightwood,Descanso,Crestline,Mount Wilson,Encinitas,Campo,Yucca Valley,New Cuyama,Mountain Center,Lake Hughes,Agua Dulce,Spring Valley,Imperial Beach,Glendale,Cedar Glen,Kearny Mesa,San Marcos,Foothill Ranch,Alpine,Jacumba,Pismo Beach ,Sierra Madre,Green Valley,Ojai,Santa Margarita,Big Bear City,Julian,San Pedro,Laguna Hills,La Quinta,Carson,La Puente,Camarillo,Mira Loma,Inglewood,Apple Valley,Westlake,Twin Peaks,Phelan,Blue Jay,Palomar Mountain,Los Olivos,La Mesa,Menifee,Covina,Huntington Park,Perris,Fillmore,Rim Forest,Beaumont,Santa Ynez,Rimforest,Topanga,San Fernando,King City

For some reason three of the Cities appear 2x even after array unique:

san bernardino, santa margarita, and big bear

What am i missing here? Why are they still appearing and how do I reset the array to the total number of Cities in the array after using array_unique.


Solution

  • The problem here is the $max = sizeof($cityArray); statement is storing the number of elements in the array before removing the duplicate items. You're using this in your for loop, and your code tries to use undefined offsets, which causes PHP to output those warnings. You need to move this statement further below, like so:

    $cityArray = array('Arcadia','San Diego','San Bernardino', ...);
    $cityArray = array_map('trim', $cityArray);
    $cityArray = array_unique($cityArray);
    $cityArray = array_merge($cityArray);
    
    $max = sizeof($cityArray);
    
    echo '<select>';    
    for ($i=0; $i<$max; $i++) {
        if($cityArray[$i] != ""){
            echo "<option value='$cityArray[$i]'>$cityArray[$i]</option>";  
        }
    }    
    echo '</select>';
    

    Demo.


    However, this will display some cities multiple times because of the whitespace at the beginning or end. To resolve this, you can remove the spaces from ends of array elements using array_map before calling array_unique(). Your code with some improvements:

    $cityArray = array_map('trim', $cityArray);
    $cityArray = array_unique($cityArray);
    $cityArray = array_values($cityArray);
    
    echo '<select>';
    foreach ($cityArray as $city) {
        echo "<option value='$city'>$city</option>";   
    }
    echo '</select>';
    

    Demo.