在做快递查询的时候需要一个中国的县市数据库,由于之前的人做行政区域是用了一个Javascript脚本做的不好在后台动态交互,在网上看到了一篇关于建立中国行政区域数据库的文章,非常好,mark一下,以免以后找不到。首先需要到国家统计局下载最新的文档(打开最新的页面,全部复制下来另存为region.txt)。然后建一个数据库表region
1 2 3 4 5 6 | 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,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <?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脚本:最新县及县以上行政区划代码