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);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM