Pregunta

Así que ya tengo una base de datos de ubicaciones de cada ciudad, estado, zip.

Actualmente estoy trabajando en cómo hacer una búsqueda y obtener resultados de los códigos postales circundantes X millas de distancia, y me he encontrado con algunos problemas.

Tengo con éxito la búsqueda trabajando para que escriba el código postal, ya que es un valor predefinido. Pero tengo problemas con los resultados de una ciudad, estado. Actualmente solo funciona si escribe solo el nombre de la ciudad, ex "Chicago" ... pero no funciona si escribe "Chicago, IL".

Aquí está el código para el $ _get del formulario de búsqueda, SearchVal

¡Por favor ayuda!

$searchval = $mysql->escape_data($_GET['searchval']);
if (!empty($searchval))
{
    if(preg_match("~\d{5}~", $searchval)) {
    $zip = $searchval;
    }
    else {
    $city = $searchval;
    }
} else
{
    $error .= "<div id='Error'>Please enter zip</div>";
    $zip = false;
}

A continuación se muestra el código que realmente toma el $ ZIP o $ City y obtiene los códigos postales circundantes. Si ingresa un código postal, funciona con éxito. Si ingresa solo un nombre de ciudad, funciona con éxito. Si ingresa a "Chicago, IL", no funciona.

       <?php
   //if user entered a city ex. "Chicago"
   if(isset($city)) {
    $q = 'SELECT City, State, ZipCode FROM zipcodes WHERE City like "'. $city .'%" ORDER BY ZipCode ASC Limit 0,10'; 
    $result = $mysql->query($q);
    $row = mysqli_fetch_array($result);
    $zip = $row[2];
    if(mysqli_num_rows($result) != 1) {
    echo"Did you mean...<br />";
    while($row = mysqli_fetch_array($result)) {
    echo "<a href='" .$_SERVER['PHP_SELF'] . "?searchval=".$row[2]."&miles=".$miles."'>" . $row[0] . " " . $row[1] . " " . $row[2] . "</a><br />";
    }
    }
    }
    $zcr = new ZipCodesRange($mysql,$zip,$miles);
    $zcr->setNewOrigin($zip);

    //if user entered a zip code ex. "08026"
    if($zcr->validateZipCode($zip)) {
    $citystate=$zcr->getCityState($zip);
    echo "Zip Codes Within " . $miles ." miles of " . $citystate[0] . ", " . $citystate[1] . " " . $zip;
    }

    $zcr->setZipCodesInRange();
    $zipArray = $zcr->getZipCodesInRange();
    asort($zipArray);
    $z = implode(",", array_keys($zipArray));

        $q = "SELECT * FROM " . TBL_PUBS . " WHERE zip IN ($z) AND( status = 'Pending' OR status = 'Active' )";
        $result = $mysql->query($q);
        while ($row = $result->fetch_object()) {
        $lonlat=$zcr->getLonLat($row->zip);
        $distance = $zcr->calculateDistance($lonlat[1], $lonlat[0], $zip);
    ?> 
¿Fue útil?

Solución

Pudo resolverlo usando esta función ... devuelve una matriz de $ arr [ciudad] $ arr [state] $ arr [zip

    function retcszarr($loc){
  $usstatenames=array('ALABAMA','ALASKA','AMERICAN SAMOA','ARIZONA','ARKANSAS','CALIFORNIA','COLORADO','CONNECTICUT','DELAWARE','DISTRICT OF COLUMBIA','FEDERATED STATES OF MICRONESIA','FLORIDA','GEORGIA','GUAM','HAWAII','IDAHO','ILLINOIS','INDIANA','IOWA','KANSAS','KENTUCKY','LOUISIANA','MAINE','MARSHALL ISLANDS','MARYLAND','MASSACHUSETTS','MICHIGAN','MINNESOTA','MISSISSIPPI','MISSOURI','MONTANA','NEBRASKA','NEVADA','NEW HAMPSHIRE','NEW JERSEY','NEW MEXICO','NEW YORK','NORTH CAROLINA','NORTH DAKOTA','NORTHERN MARIANA ISLANDS','OHIO','OKLAHOMA','OREGON','PALAU','PENNSYLVANIA','PUERTO RICO','RHODE ISLAND','SOUTH CAROLINA','SOUTH DAKOTA','TENNESSEE','TEXAS','UTAH','VERMONT','VIRGIN ISLANDS','VIRGINIA','WASHINGTON','WEST VIRGINIA','WISCONSIN','WYOMING');
  $usstateabbrs=array('AL','AK','AS','AZ','AR','CA','CO','CT','DE','DC','FM','FL','GA','GU','HI','ID','IL','IN','IA','KS','KY','LA','ME','MH','MD','MA','MI','MN','MS','MO','MT','NE','NV','NH','NJ','NM','NY','NC','ND','MP','OH','OK','OR','PW','PA','PR','RI','SC','SD','TN','TX','UT','VT','VI','VA','WA','WV','WI','WY');
    if(strpos($loc,',')!==false){
      $parts=array_map('trim',explode(',',$loc));
        $location['city']=strtoupper($parts[0]);
      preg_match('/([^ ]*)(?: +([^ ]+))?/',$parts[1],$statezip);
      if(isset($statezip[1])){
        $location['state']=strtoupper($statezip[1]);
      }
    if(isset($statezip[2])){
        $location['zip']=$statezip[2];
      }
    } else {
        $parts=array_map('trim',explode(' ',$loc));
      while(count($parts)>0){
            $part=strtoupper(array_pop($parts));
            if(in_array($part,$usstateabbrs)){
            $location['state']=$part;
          } elseif (in_array($part,$usstatenames)){
            $location['state']=$usstateabbrs[array_search($part,$usstatenames)];
          } elseif (preg_match('/\d+(?:-\d+)?/',$part,$zip)){
            $location['zip']=$zip[0];
          } else {
                $location['city']=strtoupper(implode(' ',$parts)."$part");
              break;
            }
      }
  }
    ksort($location);
    return $location;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top