在做快递查询的时候需要一个中国的县市数据库,由于之前的人做行政区域是用了一个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脚本:最新县及县以上行政区划代码