在多维数组中查找重复值

时间:2012-08-06 19:49:04

标签: php mysql multidimensional-array

我有一个来自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,其中包含STATE,COUNTY,NEIGHBORHOOD,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';"

这些邻居可能在不同的州和县,我无法知道这一点。

1 个答案:

答案 0 :(得分:0)

也许有一种更好的方法可以通过不通过SQL查询获取重复项来实现此目的,但您可以散列您的唯一值以确保删除重复项。

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

这应该会给你一个像这样的数组:

  [1] => {
           [101] => {
                      [111111] => NULL
                      [333333] => NULL
                      [......] => NULL
                      [xxxxxx] => NULL
                    }
           [201] => {
                      [111111] => NULL
                    }
         }
  [2] => {
           [201] => {
                      [222222] => 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]);
    }
}

至少,这个概念就在那里。这个想法是像这样散列会删除重复项,因为它们最终会覆盖彼此,并且它嵌套在层次结构中,这就是它自然发生的方式。

修改

我迅速将测试类放在一起,然后用该类更新了我的代码。请注意,没有有效性检查等等。但它可能是您获得所需内容的开始。

我希望有所帮助!