在做快递查询的时候需要一个中国的县市数据库,由于之前的人做行政区域是用了一个Javascript脚本做的不好在后台动态交互,在网上看到了一篇关于建立中国行政区域数据库的文章,非常好,mark一下,以免以后找不到。首先需要到国家统计局下载最新的文档(打开最新的页面,全部复制下来另存为region.txt)。然后建一个数据库表region
CREATE TABLE `region` ( `id` int(10) unsigned NOT NULL, `parent_id` int(10) unsigned NOT NULL, `name` varchar(20) NOT NULL, PRIMARY KEY (`id`) )ENGINE=MYISAM DEFAULT CHARSET=utf8;
在相同目录下建立一个文件region.php,代码如下
<?php
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('region.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;
//构建了一个数组比如$parent[0]=110000 ;$parent[1]=110100;$parent[2]=$id;
//这样子便可以根据它所缩进的空格数,确定它的层级,根据层级取得父id
$name = $value;
if (count($data)) {
$name .= implode('', $data);
}
$sql = "
INSERT INTO region (id, parent_id, name)
VALUES ({$id}, {$parent_id}, '{$name}')
";
mysql_query($sql);
}
fclose($handle);
然后在命令行运行php region.php,我的结果行数是3511。
参考链接:
实用PHP脚本:最新县及县以上行政区划代码