龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

php 使用PHP解析行政区划代码

时间:2014-06-18 20:48来源:网络整理 作者:网络 点击:
分享到:
使用PHP解析行政区划代码 话说这个PHP脚本我已经写过好多次了,不过由于国家统计局提供的数据格式有些许的变化,所以我又重写了一遍,问题既涉及到PHP,同时也涉及到MySQL,感觉很

话说这个PHP脚本我已经写过好多次了,不过由于国家统计局提供的数据格式有些许的变化,所以我又重写了一遍,问题既涉及到PHP,同时也涉及到MySQL,感觉很适合做面试题,这类问题往往最能反映出求职者的基本素质。

准备工作:需要下载最新县及县以上行政区划代码,并保存成data.txt文件。

最新县及县以上行政区划代码

首先创建MySQL表:

需要注意的是表的字符集和文件的字符集需要一致。

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;

然后编写PHP脚本:

需要注意的是自己保证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);

$sth = $dbh->prepare('
    INSERT INTO region (id, parent_id, name)
    VALUES (:id, :parent_id, :name)
');

$parent = array();

$handle = fopen('data.txt', 'r');

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_id = $level > 1 ? $parent[$level - 1] : 0;

    $parent[$level] = $id;

    $sth->bindValue(':id', $id, PDO::PARAM_INT);
    $sth->bindValue(':parent_id', $parent_id, PDO::PARAM_INT);
    $sth->bindValue(':name', $name);

    $sth->execute();
}

fclose($handle);

?>

说明:根据自己的情况填写好config就OK了。

有了官方的行政区划代码,再配上民间的纯真IP数据库,就更完美了。

转载自:http://huoding.com/2012/07/31/163

精彩图集

赞助商链接