使用PHP解析行政区划代码
- - 火丁笔记话说这个PHP脚本我已经写过好多次了,不过由于 国家统计局提供的数据格式有些许的变化,所以我又重写了一遍,问题既涉及到PHP,同时也涉及到MySQL,感觉很适合做面试题,这类问题往往最能反映出求职者的基本素质. 准备工作:需要下载 最新县及县以上行政区划代码,并保存成data.txt文件. 需要注意的是表的字符集和文件的字符集需要一致.
话说这个PHP脚本我已经写过好多次了,不过由于 国家统计局提供的数据格式有些许的变化,所以我又重写了一遍,问题既涉及到PHP,同时也涉及到MySQL,感觉很适合做面试题,这类问题往往最能反映出求职者的基本素质。
准备工作:需要下载 最新县及县以上行政区划代码,并保存成data.txt文件。
需要注意的是表的字符集和文件的字符集需要一致。
CREATE TABLE IF NOT EXISTS `region` ( `id` int(10) unsigned NOT NULL, `parent_id` int(10) unsigned NOT NULL, `name` varchar(20) NOT NULL, PRIMARY KEY (`id`), KEY `parent_id` (`parent_id`) ) ENGINE=InnoDB;
说明:想更好的存储层次化的数据,参考: Storing Hierarchical Data in a Database。
需要注意的是自己保证data.txt文件内容的合法性,代码本身未做严禁的校验。
<?php // config $host = ''; $dbname = ''; $charset = ''; $username = ''; $password = ''; set_time_limit(0); $dsn = "mysql:host={$host};dbname={$dbname};charset={$charset}"; $options = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ); $dbh = new PDO($dsn, $username, $password, $options); $handle = fopen('data.txt', 'r'); $parent = array(); while (!feof($handle)) { $row = trim(fgets($handle)); if (!preg_match('/(\d+)(\s+)(.+)/', $row, $matches)) { continue; } list($row, $id, $delimiter, $name) = $matches; if (!isset($separator)) { $separator = $delimiter; } $level = substr_count($delimiter, $separator); $parent[$level] = $id; $parent_id = $level > 1 ? $parent[$level - 1] : 0; $sth = $dbh->prepare(' INSERT INTO region (id, parent_id, name) VALUES (:id, :parent_id, :name) '); $sth->bindValue(':id', $id, PDO::PARAM_INT); $sth->bindValue(':parent_id', $parent_id, PDO::PARAM_INT); $sth->bindValue(':name', $name); $sth->execute(); } fclose($handle); ?>
说明:根据自己的情况填写好配置选项就可以运行了。
……
有了官方的行政区划代码,再配上民间的 纯真IP数据库,就可以百尺竿头更进一步了。