PHP array_unique导致找到不正确的重复以及如何摆脱未定义的偏移量?

时间:2013-12-20 17:31:04

标签: php arrays

这是我的循环:

$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>";   
            }
        }

我有这个城市阵列($ 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

我试图摆脱重复,所以我运行array_unique($ cityArray),我发现我必须运行array_merge($ cityArray)将数组计数重置为0(但我的数组后仍然得到未设置的偏移量.. 。):

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

出于某种原因,即使在阵列唯一之后,三个城市也会出现2倍:

san bernardino, santa margarita, and big bear

我在这里缺少什么?为什么它们仍然出现,如何在使用array_unique后将数组重置为数组中的城市总数。

2 个答案:

答案 0 :(得分:1)

在一些名字后面有空格。删除它们。 PHP认为“name”与“name”不同。另外,抛弃array_merge()。没有必要。使用foreach()循环数组。

$cityArray = array_filter($cityArray, 'trim');
$cityArray = array_unique($cityArray);
foreach ( $cityArray as $v ) {
    echo "<option value='".$v."'>".$v."</option>";   
}

请注意,以这种方式修剪也会删除空白条目。

答案 1 :(得分:1)

此处的问题是$max = sizeof($cityArray);语句在删除重复项之前存储数组中的元素数。您在for循环中使用此元素,并且您的代码尝试使用未定义的偏移量,这会导致PHP输出这些警告。您需要在下面进一步移动此声明,如下所示:

$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.


但是,由于开头或结尾有空格,这会多次显示一些城市。要解决此问题,您可以在调用array_map之前使用array_unique()从数组元素的末尾删除空格。您的代码有一些改进:

$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.