作者:老王
用户注册之类的功能多半需要选择一下地区,所以有一份行政区划代码是很必要的,这份代码可以在 国家统计局下载到(保存成 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);
注:有的地区名字带有*符号:
截止2008年12月31日的数据是3525行,运行后可以确认一下是否正确。如果想更高效,还可以把数据转换成先根遍历树风格的,恕不详述。
用户注册之类的功能多半需要选择一下地区,所以有一份行政区划代码是很必要的,这份代码可以在 国家统计局下载到(保存成 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行,运行后可以确认一下是否正确。如果想更高效,还可以把数据转换成先根遍历树风格的,恕不详述。