2012-08-06 4 views
0

나는 MySQL 데이터베이스 호출로부터 다차원 배열을 가지고있다.다차원 배열에서 중복 값 찾기

array(2) { 
    [0]=> array(4) { 
     ["STATE"]=> "1" 
     ["COUNTY"]=> "101" 
     ["NEIGHBORHOOD"]=> "111111" 
    } 

    [1]=> array(4) { 
     ["STATE"]=> "2" 
     ["COUNTY"]=> "201" 
     ["NEIGHBORHOOD"]=> "222222" 
    } 

    [2]=> array(4) { 
     ["STATE"]=> "1" 
     ["COUNTY"]=> "201" 
     ["NEIGHBORHOOD"]=> "111111" 
    } 
} 

배열에 나타나는 모든 상태의 모든 카운티에 대해 인접 지역 값을 가져올 수 있어야합니다. 데이터 구조는 이웃 번호가 카운티에 고유 한 것으로 국가 고유의 것입니다.

각 주마다 각 카운티의 배열을 만들려고 생각하고 있지만 주와 카운티가 동일 할 때 모든 이웃 값을 찾는 방법을 모르겠습니다.

의견에 따라 DB에 주, 카운티, 이웃, LATITUDE, LONGITUDE에 대한 정보가 있습니다. 다음 SQL 문을 사용하여 사용자가 입력 한 위치의 반경 내에서 모든 중개자를 가져옵니다.

"SELECT `STATE` , `COUNTY` , `NEIGHBORHOOD`,((ACOS(SIN($lat* PI()/180) * SIN(`LATITUDE` * PI()/180) + 
     COS($lat* PI()/180) * COS(`LATITUDE` * PI()/180) * COS(($long- `LONGITUDE`) * 
     PI()/180)) * 180/PI()) * 60 * 1.1515) AS distance 
     FROM `censustracts` 
     HAVING distance<='$radius';" 

이 지역은 다른 주와 카운티에있을 수 있고, 나는 이것을 알 방법이 없습니다.

+0

나는 당신이 당신의 쿼리를 최적화하기를 원한다고 생각한다. 그래서 당신은 정말로 원하는 결과만을 얻는다. 결과 집합은 더 작아지고 PHP에서는 처리량이 줄어 듭니다. 도움이 필요하면 질문에 질문을 추가하십시오. – arnoudhgz

+0

여기 예제에 포함되지 않은 것은 좌표 데이터를 기반으로한다는 것입니다. 그래서 나는 주어진 점의 x 마일 반경 내에서 모든 것을 끌고있다. 따라서 내 중심점이 국경에있는 경우 여러 카운티 또는 주에서 가져올 수 있습니다. 나는 말할 길이 없다. – micahmills

+0

쿼리에 대한 정보와 데이터 구조가 모델화 된 방법 및 데이터베이스에서 실행이 제거되는 방법에 대한 정보를 포함하도록 질문을 편집해야합니다. – Whisperity

답변

0

아마도 SQL 쿼리를 통해 중복을 가져 오지 않아도이를 수행하는 더 좋은 방법이 있지만 고유 값을 해싱하여 중복이 제거되도록 할 수 있습니다. 주어진 주 또는 카운티에 대한 모든 지역 등을 반환하는 클래스로

[1] => { 
      [101] => { 
         [111111] => NULL 
         [333333] => NULL 
         [......] => NULL 
         [xxxxxx] => NULL 
        } 
      [201] => { 
         [111111] => NULL 
        } 
     } 
    [2] => { 
      [201] => { 
         [222222] => NULL 
        } 
     } 

마음이 구성에이, 당신이 캡슐을이 같은 배열로 당신을 떠나지해야

$tmp = array(); 
foreach($array as $r) { 
    $tmp[ $r["STATE"] ][ $r["COUNTY"] ][ $r["NEIGHBORHOOD"] ] = NULL; 
} 

.

class myClass{ 
    protected $_data; 

    public function __construct($array) 
    { 
     $tmp = array(); 
     foreach($array as $r) { 
      $tmp[ $r["STATE"] ][ $r["COUNTY"] ][ $r["NEIGHBORHOOD"] ] = NULL; 
     } 
     $this->_data = $tmp; 
    } 

    public function getNeighborhoods($state, $county) { 
     return array_keys($this->_data[$state][$county]); 
    } 
} 

적어도 개념은 있습니다. 아이디어는 이것을 해싱하면 중복을 제거 할 수 있으며, 서로 겹쳐 쓰게되고 자연스럽게 발생하는 계층 구조에 중첩됩니다.

편집

나는 빨리 함께 테스트 클래스를 던져 버리고 그 클래스 내 코드를 업데이트했습니다. 명심하십시오, 유효성 검사 등은 없습니다. 그러나 당신이 찾고있는 것을 얻기위한 시작일 수 있습니다.

도움이 되었기를 바랍니다.

+0

도움을 주셔서 감사합니다. – micahmills

관련 문제