· 9 years ago · Dec 08, 2016, 10:37 AM
1<?php
2
3$directly = ['11', '12', '31', '50', '81', '82'];
4$names = [
5 '拉祜æ—佤æ—布朗æ—å‚£æ—自治县', 'ä¿å®‰æ—ä¸œä¹¡æ—æ’’拉æ—自治县', '彿—å“ˆå°¼æ—æ‹‰ç¥œæ—自治县', 'å‚£æ—æ‹‰ç¥œæ—佤æ—自治县',
6 '哈尼æ—彿—å‚£æ—自治县', '彿—回æ—è‹—æ—自治县', 'å¸ƒä¾æ—è‹—æ—自治县', 'å¸ƒä¾æ—è‹—æ—自治州', 'ç™½æ—æ™®ç±³æ—自治县',
7 'å‚£æ—æ™¯é¢‡æ—自治州', 'ç‹¬é¾™æ—æ€’æ—自治县', '哈尼æ—彿—自治县', '哈尼æ—彿—自治县', '哈尼æ—彿—自治州',
8 '满æ—è’™å¤æ—自治县', 'è’™å¤æ—è—æ—自治州', 'è‹—æ—å¸ƒä¾æ—自治县', 'è‹—æ—土家æ—自治县', '土家æ—è‹—æ—自治县',
9 '土家æ—è‹—æ—自治州', '仡佬æ—è‹—æ—自治县', 'è—æ—羌æ—自治州', 'å‚£æ—佤æ—自治县', 'å‚£æ—彿—自治县', '哈è¨å…‹æ—自治县',
10 '回æ—土æ—自治县', '回æ—彿—自治县', '柯尔克åœè‡ªæ²»å·ž', '黎æ—è‹—æ—自治县', 'è‹—æ—ä¾—æ—自治县', 'è‹—æ—ä¾—æ—自治州',
11 '彿—å‚£æ—自治县', '彿—回æ—自治县', '彿—è‹—æ—自治县', '壮æ—ç‘¶æ—自治县', 'æœé²œæ—自治县', 'æœé²œæ—自治州',
12 '哈尼æ—自治县', '哈è¨å…‹è‡ªæ²»åŽ¿', '哈è¨å…‹è‡ªæ²»å·ž', '拉祜æ—自治县', '傈僳æ—自治县', '傈僳æ—自治州', 'æ¯›å—æ—自治县',
13 'è’™å¤æ—自治县', '仫佬æ—自治县', '纳西æ—自治县', '撒拉æ—自治县', 'å¡”å‰å…‹è‡ªæ²»åŽ¿', '土家æ—自治县', 'ç»´å¾å°”自治区',
14 'æ–¡å°”æ—自治旗', '裕固æ—自治县', '白æ—自治州', 'è—æ—自治县', 'è—æ—自治州', '达斡尔æ—区', 'å‚£æ—自治州',
15 'ä¾—æ—自治县', '儿—自治县', '回æ—自治区', '回æ—自治县', '回æ—自治州', '黎æ—自治县', '满æ—自治县', 'è’™å¤è‡ªæ²»åŽ¿',
16 'è’™å¤è‡ªæ²»å·ž', 'è‹—æ—自治县', '羌æ—自治县', '畲æ—自治县', 'æ°´æ—自治县', '特别行政区', '土æ—自治县', '佤æ—自治县',
17 '锡伯自治县', 'ç‘¶æ—自治县', '彿—自治县', '彿—自治州', '壮æ—自治区', 'æ—自治县', '回æ—区', '自治旗', '自治区',
18 '地区', '矿区', '特区', '新区', '盟', '区', 'çœ', '市', '县',
19];
20$special = [
21 '本溪满æ—自治县' => '本溪县', '神农架林区' => '神农架', 'é˜œæ–°è’™å¤æ—自治县' => '阜新县', '清新区' => '清新',
22];
23$except = [
24 '上饶县', '东è¥åŒº', '临å¤å¸‚', '临å¤åŽ¿', 'ä¹Œé²æœ¨é½åŽ¿', '乿±ŸåŽ¿', '井陉县', '井陉矿区', '伊å®åŽ¿', '伊å®å¸‚',
25 '伊春区', '克拉玛ä¾åŒº', 'å—æ˜ŒåŽ¿', 'å‰å®‰åŽ¿', '剿ž—市', '和田市', '和田县', '喀什市', '塔城市', '大åŒåŽ¿',
26 '大ç†å¸‚', '安阳县', '宜宾县', '宣化县', '宣化区', '岳阳县', '广安区', 'æ©æ–½å¸‚', '承德县', '抚顺县', '新乡县',
27 '昌å‰å¸‚', 'æœé˜³åŽ¿', 'æ ªæ´²åŽ¿', '楚雄市', '淮安区', '湘æ½åŽ¿', '濮阳县', 'çŽ‰æ ‘å¸‚', '甘åœåŽ¿', '白银区', '红河县',
28 '芜湖县', 'è†å·žåŒº', '衡阳县', '许昌县', '辽阳县', '通化县', 'é‚¢å°åŽ¿', '那曲县', '邵阳县', 'é“å²åŽ¿', '长沙县',
29 '长治县', '阿克è‹å¸‚', '阿勒泰市', '阿å县', '黄山区',
30];
31$districts = [
32 '东莞', 'ä¸å±±', '三沙', 'å„‹å·ž', '嘉峪关',
33];
34
35$data = file_get_contents('districts.txt');
36
37$php = fopen('districts.php', 'w');
38$sql = fopen('districts.sql', 'w');
39
40fputs($php, "<?php\n\n");
41fputs($php, "// `id`, `name`, `title`, `parent_id`, `is_city`, `is_district`\n");
42fputs($php, "return [\n");
43
44$header = <<<EOF
45/*!40101 SET NAMES utf8 */;
46
47DROP TABLE IF EXISTS `districts`;
48/*!40101 SET character_set_client = utf8 */;
49CREATE TABLE `districts` (
50 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
51 `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'åç§°',
52 `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '全称',
53 `parent_id` int(11) DEFAULT NULL COMMENT '上级',
54 `is_city` tinyint(1) NOT NULL COMMENT '是å¦åŸŽå¸‚',
55 `is_district` tinyint(1) NOT NULL COMMENT '是å¦åŽ¿åŒº',
56 PRIMARY KEY (`id`),
57 KEY `idx-district-parent_id` (`parent_id`),
58 KEY `idx-district-is_city` (`is_city`),
59 KEY `idx-district-is_district` (`is_district`),
60 CONSTRAINT `fk-district-parent_id` FOREIGN KEY (`parent_id`) REFERENCES `district` (`id`) ON DELETE CASCADE
61) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
62
63LOCK TABLES `districts` WRITE;
64
65EOF;
66fputs($sql, $header);
67
68$insert = [];
69foreach (explode("\n", $data) as $row) {
70 $row = trim($row);
71 if (!empty($row)) {
72 list($code, $name, $title, $parent, $is_city, $is_district) = call_user_func_array('row', array_map(function ($d) {
73 return trim($d);
74 }, explode(' ', $row, 2)));
75 fputs($php, "\t[{$code}, '{$name}', '{$title}', {$parent}, {$is_city}, {$is_district}],\n");
76 $insert[] = "({$code}, '{$name}', '{$title}', {$parent}, {$is_city}, {$is_district})";
77 }
78}
79
80fputs($php, "];\n");
81foreach (array_chunk($insert, 500) as $d) {
82 fputs($sql, "INSERT INTO `districts` VALUES\n" . implode(",\n", $d) . ";\n");
83}
84fputs($sql, "UNLOCK TABLES;\n");
85
86function row($code, $title)
87{
88 global $directly, $districts;
89 $name = name($title);
90 if (in_array(substr($code, 0, 2), $directly)) {
91 if (substr($code, 2, 4) == '0000') {
92 // 直辖市/特别行政区
93 return [code2id($code), $name, $title, 'null', 1, 0];
94 }
95 // 直辖市下辖区县市
96 return [code2id($code), $name, $title, code2id(substr($code, 0, 2) . '0000'), 0, 1];
97 } elseif (substr($code, 2, 4) == '0000') {
98 // çœ/自治区
99 return [code2id($code), $name, $title, 'null', 0, 0];
100 } elseif (substr($code, 4, 2) == '00') {
101 if (in_array($name, $districts)) {
102 // ä¸è®¾åŒºçš„地级市
103 return [code2id($code), $name, $title, code2id(substr($code, 0, 2) . '0000'), 1, 1];
104 }
105 // 地级市
106 return [code2id($code), $name, $title, code2id(substr($code, 0, 2) . '0000'), 1, 0];
107 } elseif (substr($code, 2, 2) == '90') {
108 // çœç›´ç®¡åŽ¿å¸‚
109 return [code2id($code), $name, $title, code2id(substr($code, 0, 2) . '0000'), 1, 1];
110 }
111 // 区县市
112 return [code2id($code), $name, $title, code2id(substr($code, 0, 4) . '00'), 0, 1];
113}
114
115function code2id($code)
116{
117 static $n = 1, $codes = [];
118 if (isset($codes[$code])) {
119 return $codes[$code];
120 }
121 return $codes[$code] = $n++;
122}
123
124function name($title)
125{
126 global $names, $special, $except;
127
128 $len = mb_strlen($title);
129 if ($len < 3 || in_array($title, $except)) {
130 // å•å区县和ä¸å¤„ç†çš„æ•°æ®
131 return $title;
132 }
133 if (isset($special[$title])) {
134 // 特殊处ç†çš„æ•°æ®
135 return $special[$title];
136 }
137 foreach ($names as $end) {
138 $len = strlen($end);
139 if (substr($title, -$len) == $end) {
140 // 截æ–处ç†
141 return substr($title, 0, -$len);
142 }
143 }
144 // æ——
145 return $title;
146}