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,该程序会在每次执行时自动向本地日志 ...
随机推荐
- BZOJ 3314 [Usaco2013 Nov]Crowded Cows:单调队列
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3314 题意: N头牛在一个坐标轴上,每头牛有个高度.现给出一个距离值D. 如果某头牛在它的 ...
- cifs挂载远程文件出现 No such device or address错误
1. 参考 https://www.raspberrypi.org/forums/viewtopic.php?t=82199 找了两天看到这个文章才解决了问题. 我是之前同事在windows上挂载成功 ...
- C#多线程学习 之 线程池[ThreadPool]
在多线程的程序中,经常会出现两种情况: 一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应 这一般使用ThreadPo ...
- COM对象创建过程
在客户端需要调用COM组件时,通常调用windowAPI函数: STDAPI CoCreateInstance( REFCLSID rclsid, //创建的Com对象的类标识符(CLSID) LPU ...
- suse enterprise Linux 11上配置 oracle11g和tomcat开机自启动
一.oracle 11g r2自启动 1.修改/etc/sysconfig/oracle文件: ORACLE_BASE=/oracle //此处改为你安装的oracle目录 START_ORACLE ...
- "The object cannot be deleted because it was not found in the ObjectStateManager."
最近优化EF的性能时遇到一个问题, 当在EF生成的Entityes的构造里加上: this.protocolnodes.MergeOption = MergeOption.NoTracking;thi ...
- hibernate学习 六 Hibernate缓存
缓存: 如果在集群环境下使用Hibernate时,(集群有节点A ,节点B) 当请求,发往A节点,A在数据库中修改了一条记录,然后节点B的缓存中如何实时的更新节点A修改的新数据 hi ...
- stm32之开发入门
一.开发环境配置 在开发stm32应用之前,我们需要先配置好开发环境. 首先从keil官网下载keil MDK-ARM软件包(v5版本与v4版本不同,v5版本需要下载额外的stm32芯片包)和芯片包( ...
- jQuery contextMenu使用
地址:jQuery contextMenu 需要以下文件: jquery.contextMenu.css jquery.min.css jquery.contextMenu.js jquery.ui. ...
- WPF系列学习之三(路由事件)
路由事件实际上以一上 列三种方式出现. 1.与普通的.net事件类似的直接路由事件.它们起源于一个元素,并且不传递给其他元素.例如:MouseEnter事件. 2.在包含层次中向上传递的冒 ...