PHP全国省市区地址分割提取脚本程序
github地址: https://github.com/zmxfree/addressapart
比如将 浙江省杭州市江干区XX路X号 分割成 浙江省 杭州市 江干区 XX路X号,方便excel操作。
目前支持大部分中国省市区地址信息的分割,可以自行更新地址源信息。
主程序代码:
<?php
/**-
* 省市区地址分割
* 将 浙江省杭州市江干区XX路X号 分割成 浙江省 杭州市 江干区 XX路X号
* User: zmxfree@gmail.com
* Date: 14-6-18
* Time: 下午12:52
*/ /**此引入文件应包含全国所有的省市区信息
* 文件格式为多维数组,键是地名,值可以赋一个编号,供回查
* array(
* [0] => array('浙江省' => '1','北京市' => '2','上海市' => '3',...),
* [1] => array('杭州市' => '1-1','宁波市' => '1-2','市辖区(一般的直辖市会分为市辖区和周边地区)' => '2-1,3-1',...),
* [3] => array('西湖区' => '1-1-1','江干区' => '1-1-2','海淀区'=>'2-1-1',...),
* [4] => array('可按需求添加城镇信息')
* )
* 这样的结构CRUD操作很方便,不需要严格按照省市区结构分配。
*/
$address = include('address.info.php');
$cache_file = 'lenarr.cache.php';
mb_internal_encoding('utf8');
$len_arr = array();
if (is_file($cache_file) && is_readable($cache_file)) {
//读取省市区长度缓存
$len_arr = include($cache_file);
} else {
$fp = fopen($cache_file, 'w');
//省市区的数量有很多,但长度却是有限的,直接计算出长度,用长度去匹配,大大减少匹配次数
$len_arr[] = array_values(array_unique(array_map('mb_strlen', array_keys($address[0])))); //所有省的长度
$len_arr[] = array_values(array_unique(array_map('mb_strlen', array_keys($address[1])))); //市的长度
$len_arr[] = array_values(array_unique(array_map('mb_strlen', array_keys($address[2])))); //区的长度
//保存文件缓存
$result = fwrite($fp, '<?php return ' . var_export($len_arr, true) . ';?>');
fclose($fp);
} //读取要分割的地址
$f = './address.log';
$fstr = is_file($f) && is_readable($f) ? file_get_contents($f) : '';
$add_arr = explode("\n", $fstr); if (is_array($add_arr)) {
foreach ($add_arr as $addr) {
//初始化
$l = 0;
$i = 0;
$p = 0;
$find = false;
$arr_get = array();
$addr = trim($addr); while (!$find) {
//判断是否超出lenarr数组的长度
if (!isset($len_arr[$l])) {
$arr_get[] = mb_substr($addr, $p, null);
$find = true;
break;
} //截取地址
$ad = mb_substr($addr, $p, $len_arr[$l][$i]);
//匹配,匹配到就进入下一层级即$l++
if (isset($address[$l][$ad])) {
$arr_get[] = $ad; //存储值
$p += $len_arr[$l][$i];
$i = 0;
$l++;
continue;
}
$i++; //判断当前层级是否循环完毕
//当前层级循环完毕仍未匹配到,则循环下一层级,一般是直辖市比如北京市海淀区这种情况,或者是信息不全
if (isset($len_arr[$l]) && $i >= count($len_arr[$l])) {
echo $ad . '<br/>'; //记录下来
$i = 0;
$l++;
continue;
}
}
//分割好的地址写入文件
file_put_contents('address.detail', implode("\t", $arr_get) . "\n", FILE_APPEND);
}
}
PHP全国省市区地址分割提取脚本程序的更多相关文章
- 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址
驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...
- WebResponse 取出全国省市区的邮编
WebResponse用法(根据省市区地址查询其邮编): class Program { static string url { get; set; } static void Main(string ...
- 创建和运行shell脚本程序
转载请标明http://www.cnblogs.com/winifred-tang94/ 要创建一个shell脚本程序,首先新建一个文本文件,然后在这个文本文件中按照shell编程规则输入shell命 ...
- 三级联动查询全国省市区(xml与数据库)
提供有china.xml和china.sql文件,实现全国省市区的三级联动效果 一.xml实现 import java.awt.EventQueue; import javax.swing.JFram ...
- Xtrabackup每周增量备份脚本程序
Xtrabackup每周增量备份脚本程序(含附件) 程序描述 本程序是一个对percona xtrabackup使用的脚本,它完成了MySQL每周的备份. 程序结构 此程序包含了4个目录(bin. ...
- 中国省市区地址三级联动jQuery插件 案例下载
中国省市区地址三级联动jQuery插件 案例下载 distpicker 是一款可以实现中国省市区地址三级联动jQuery插件.它使用简单,简单设置即可完成中国省市区地址联动效果. 安装 可以通过npm ...
- Linux CAN Shell 测试脚本程序
2012-01-13 22:57:14 为我的开发板2440做二次开发,添加了can驱动,做了驱动测试程序,没理由不添加一个测试脚本程序啊!修改了测试程序,使应用程序更加灵活,添加了一下传递参数.接着 ...
- 09 shell脚本程序练习
练习1:写一个脚本程序,完成以下任务 1.添加五个用户,user1.user2.user3.user4.user5: 2.添加之前先判断是否存在该用户,如果存在则显示“某某用户已存在”: 3.每个用户 ...
- 在Linux中以普通用户开机自动运行脚本程序
测试环境:CentOS6.5 管理员:root 普通用户:test1 实现目标:在Linux启动时,以普通用户test1自动运行位于根目录下的脚本程序test.py,该程序会在每次执行时自动向本地日志 ...
随机推荐
- [原创]java操作word生成水印
应用场景 为了保护版权或辨别文件的真伪,有时需要在生成的Word文件中动态添加水印,PageOffice组件的WaterMark类就封装了给在线编辑的Word文件添加水印这一功能,调用接口非常简单. ...
- Go丨语言学习笔记--func
Java语言跟Go语言的函数比较 Go语言 func funcName(input type1,input type2,......)(output type1,output type2,...... ...
- Posix线程编程指南(1)
这是一个关于Posix线程编程的专栏.作者在阐明概念的基础上,将向您详细讲述Posix线程库API.本文是第一篇将向您讲述线程的创建与取消. 一.线程创建 1.1 线程与进程相对进程而言,线程是一 ...
- Unity-2017.2官方实例教程Roll-a-ball(一)
声明: 本文系转载,由于Unity版本不同,文中有一些小的改动,原文地址:http://www.jianshu.com/p/6e4b0435e30e Unity-2017.2官方实例教程Roll-a- ...
- 集训Day1
雅礼集训2017Day1的题 感觉上不可做实际上还挺简单的吧 T1 区间加 区间除法向下取整 查询区间和 区间最小值 大力上线段树,把除法标记推到底,加法标记就是按照线段树的来 先拿30 然后60的数 ...
- hdu3518 Boring Counting[后缀排序]
裸的统计不同的重复出现子串(不重叠)种数的题.多次使用后缀排序要注意小细节.y数组在重复使用时一定要清空,看那个line25 +k就明白了 ,cnt也要清空,为什么就不说了 #include<b ...
- WPF ValidationRule 触发ErrorTemplate 的注意事项
ValidationRule 验证时, 当验证失败后,再次验证成功, errorTemplate 还是触发, 不会被清掉. 因此需要主动调用 Validation.ClearInvalid(dtpTe ...
- Binary Tree Inorder Traversal-非递归实现中序遍历二叉树
题目描述: 给定一颗二叉树,使用非递归方法实现二叉树的中序遍历 题目来源: http://oj.leetcode.com/problems/binary-tree-inorder-traversal/ ...
- Poll: Most Americans&n…
Most Americans support tough new measures to counter gun violence, including banning assault weapons ...
- java Class类
java Class类 Class类(在java.lang包中,Instances of the class Classrepresent classes and interfaces in a ru ...