github地址:https://github.com/zmxfree/addressapart 比如将 浙江省杭州市江干区XX路X号 分割成 浙江省 杭州市 江干区 XX路X号 ,方便excel操作。 目前支持大部分中国省市区地址信息的分割,可以自行更新地址源信息。 主程序代码: ? php /* *- * 省市区地
github地址: https://github.com/zmxfree/addressapart
比如将 浙江省杭州市江干区XX路X号 分割成 浙江省 杭州市 江干区 XX路X号,方便excel操作。
目前支持大部分中国省市区地址信息的分割,可以自行更新地址源信息。
主程序代码:
<?<span>php
</span><span>/*</span><span>*-
* 省市区地址分割
* 将 浙江省杭州市江干区XX路X号 分割成 浙江省 杭州市 江干区 XX路X号
* User: zmxfree@gmail.com
* Date: 14-6-18
* Time: 下午12:52
</span><span>*/</span>
<span>/*</span><span>*此引入文件应包含全国所有的省市区信息
* 文件格式为多维数组,键是地名,值可以赋一个编号,供回查
* 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操作很方便,不需要严格按照省市区结构分配。
</span><span>*/</span>
<span>$address</span> = <span>include</span>('address.info.php'<span>);
</span><span>$cache_file</span> = 'lenarr.cache.php'<span>;
mb_internal_encoding(</span>'utf8'<span>);
</span><span>$len_arr</span> = <span>array</span><span>();
</span><span>if</span> (<span>is_file</span>(<span>$cache_file</span>) && <span>is_readable</span>(<span>$cache_file</span><span>)) {
</span><span>//</span><span>读取省市区长度缓存</span>
<span>$len_arr</span> = <span>include</span>(<span>$cache_file</span><span>);
} </span><span>else</span><span> {
</span><span>$fp</span> = <span>fopen</span>(<span>$cache_file</span>, 'w'<span>);
</span><span>//</span><span>省市区的数量有很多,但长度却是有限的,直接计算出长度,用长度去匹配,大大减少匹配次数</span>
<span>$len_arr</span>[] = <span>array_values</span>(<span>array_unique</span>(<span>array_map</span>('mb_strlen', <span>array_keys</span>(<span>$address</span>[0])))); <span>//</span><span>所有省的长度</span>
<span>$len_arr</span>[] = <span>array_values</span>(<span>array_unique</span>(<span>array_map</span>('mb_strlen', <span>array_keys</span>(<span>$address</span>[1])))); <span>//</span><span>市的长度</span>
<span>$len_arr</span>[] = <span>array_values</span>(<span>array_unique</span>(<span>array_map</span>('mb_strlen', <span>array_keys</span>(<span>$address</span>[2])))); <span>//</span><span>区的长度
//保存文件缓存</span>
<span>$result</span> = <span>fwrite</span>(<span>$fp</span>, '<?php return ' . <span>var_export</span>(<span>$len_arr</span>, <span>true</span>) . ';?>'<span>);
</span><span>fclose</span>(<span>$fp</span><span>);
}
</span><span>//</span><span>读取要分割的地址</span>
<span>$f</span> = './address.log'<span>;
</span><span>$fstr</span> = <span>is_file</span>(<span>$f</span>) && <span>is_readable</span>(<span>$f</span>) ? <span>file_get_contents</span>(<span>$f</span>) : ''<span>;
</span><span>$add_arr</span> = <span>explode</span>("\n", <span>$fstr</span><span>);
</span><span>if</span> (<span>is_array</span>(<span>$add_arr</span><span>)) {
</span><span>foreach</span> (<span>$add_arr</span> <span>as</span> <span>$addr</span><span>) {
</span><span>//</span><span>初始化</span>
<span>$l</span> = 0<span>;
</span><span>$i</span> = 0<span>;
</span><span>$p</span> = 0<span>;
</span><span>$find</span> = <span>false</span><span>;
</span><span>$arr_get</span> = <span>array</span><span>();
</span><span>$addr</span> = <span>trim</span>(<span>$addr</span><span>);
</span><span>while</span> (!<span>$find</span><span>) {
</span><span>//</span><span>判断是否超出lenarr数组的长度</span>
<span>if</span> (!<span>isset</span>(<span>$len_arr</span>[<span>$l</span><span>])) {
</span><span>$arr_get</span>[] = mb_substr(<span>$addr</span>, <span>$p</span>, <span>null</span><span>);
</span><span>$find</span> = <span>true</span><span>;
</span><span>break</span><span>;
}
</span><span>//</span><span>截取地址</span>
<span>$ad</span> = mb_substr(<span>$addr</span>, <span>$p</span>, <span>$len_arr</span>[<span>$l</span>][<span>$i</span><span>]);
</span><span>//</span><span>匹配,匹配到就进入下一层级即$l++</span>
<span>if</span> (<span>isset</span>(<span>$address</span>[<span>$l</span>][<span>$ad</span><span>])) {
</span><span>$arr_get</span>[] = <span>$ad</span>; <span>//</span><span>存储值</span>
<span>$p</span> += <span>$len_arr</span>[<span>$l</span>][<span>$i</span><span>];
</span><span>$i</span> = 0<span>;
</span><span>$l</span>++<span>;
</span><span>continue</span><span>;
}
</span><span>$i</span>++<span>;
</span><span>//</span><span>判断当前层级是否循环完毕
//当前层级循环完毕仍未匹配到,则循环下一层级,一般是直辖市比如北京市海淀区这种情况,或者是信息不全</span>
<span>if</span> (<span>isset</span>(<span>$len_arr</span>[<span>$l</span>]) && <span>$i</span> >= <span>count</span>(<span>$len_arr</span>[<span>$l</span><span>])) {
</span><span>echo</span> <span>$ad</span> . '<br/>'; <span>//</span><span>记录下来</span>
<span>$i</span> = 0<span>;
</span><span>$l</span>++<span>;
</span><span>continue</span><span>;
}
}
</span><span>//</span><span>分割好的地址写入文件</span>
<span>file_put_contents</span>('address.detail', <span>implode</span>("\t", <span>$arr_get</span>) . "\n",<span> FILE_APPEND);
}
}</span>
立即学习“PHP免费学习笔记(深入)”;
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号