程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 使用PHP解析行政區劃代碼

使用PHP解析行政區劃代碼

編輯:關於PHP編程

話說這個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;
補充:更好的存儲層次化的數據:Storing Hierarchical Data in a Database Article。

然後編寫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);

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

    $parent[$level] = $id;

    $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數據庫,就更完美了。

作者:老王

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved