现在的位置: 首页 > 综合 > 正文

实用PHP脚本:最新县及县以上行政区划代码

2013年12月04日 ⁄ 综合 ⁄ 共 1281字 ⁄ 字号 评论关闭
作者:老王

用户注册之类的功能多半需要选择一下地区,所以有一份行政区划代码是很必要的,这份代码可以在国家统计局下载到(保存成file.txt文件,utf-8编码)。以前每次用时我都是现写转换代码,这次又重新写了一份,索性放到网上存着,免得以后麻烦,大家如果需要也可以瞧瞧。

首先创建一个表(utf-8编码):

CREATE TABLE `district` (
`id` int(10) unsigned NOT NULL,
`parent_id` int(10) unsigned NOT NULL,
`name` char(15) NOT NULL,
PRIMARY KEY (`id`)
);

然后编写一个脚本(utf-8编码):

set_time_limit(0);

define('ENGLISH_BLANK', chr(32));
define('CHINESE_BLANK', chr(227) . chr(128) . chr(128));

mysql_connect('localhost', 'root', '');
mysql_select_db('test');

mysql_query("SET NAMES 'utf8'");

$parent = array();

$handle = fopen('file.txt', 'r');
while (!feof($handle)) {
    $data = explode(CHINESE_BLANK, str_replace(
        ENGLISH_BLANK . ENGLISH_BLANK, CHINESE_BLANK, trim(fgets($handle))
    ));

    if (!is_numeric($id = array_shift($data))) {
        continue;
    }

    $level = 0;
    while (($value = array_shift($data)) !== false) {
        if ($value == '') {
            $level++;
        } else {
            break;
        }
    }
    $parent[$level] = $id;

    $parent_id = $level ? $parent[$level - 1] : 0;

    $name = $value;
    if (count($data)) {
        $name .= implode('', $data);
    }

    $sql = "
        INSERT INTO district (id, parent_id, name)
        VALUES ({$id}, {$parent_id}, '{$name}')
    ";

    mysql_query($sql);
}
fclose($handle);

注:有的地区名字带有*符号:SELECT * FROM `district` WHERE `name` LIKE '%*%',可以手动处理。

截止2008年12月31日的数据是3525行,运行后可以确认一下是否正确。如果想更高效,还可以把数据转换成先根遍历树风格的,恕不详述。

抱歉!评论已关闭.