zoukankan      html  css  js  c++  java
  • 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("
    ", $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("	", $arr_get) . "
    ", FILE_APPEND);
        }
    }
  • 相关阅读:
    判断数据库内容,在页面显示自定义数据case when
    其他窗体赋值给comboBox实现值的回显,并使赋的值处于选中状态(根据text获取selectedindex)
    DataGridView的按钮列的点击事件
    表单中各种input汇总
    块元素、内敛元素、行内块元素特点、相互转换、取消默认效果
    内联元素,取消间隙和默认效果
    margin-top塌陷
    linux下安装 配置 redis数据库
    redis数据库各种数据类型的增删改查命令
    python与mongodb的交互 增删改差
  • 原文地址:https://www.cnblogs.com/zmxfree/p/3809885.html
Copyright © 2011-2022 走看看