標籤:style class blog code http color
github地址: https://github.com/zmxfree/addressapart
比如將 浙江省杭州市江幹區XX路X號 分割成 浙江省 杭州市 江幹區 XX路X號,方便excel操作。
目前支援大部分中國省市區地址資訊的分割,可以自行更新地址源資訊。
主程式碼:
<?php/**- * 省市區地址分割 * 將 浙江省杭州市江幹區XX路X號 分割成 浙江省 杭州市 江幹區 XX路X號 * User: [email protected] * 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); }}