下面由laravel框架教程欄目給大家介紹根據IP獲取省市名稱的方法,希望對需要的朋友有所幫助!
根據 ip 獲取地理定位,曾嘗試了 laravel的torann/geoip 包,不是很準確。還有 百度 api 調用獲取地理信息的方法,為了減少維護成本,最終用了thinkphp3.2 中的一個包,是否是tp框架自帶的不很清楚。這個包獲取定位的原理是內置了省市數據庫 utfwry.dat。
laravel 項目如何使用
我放在了項目 app 同級目錄 sdk 下。為了能夠使用,composer.json 中需將 IpLocation.class.php 添加到 classmap 自動加載中,以便該文件中包含的類能夠在被調用時被自動加載(如果不太明白為何能自動加載,參考 Laravel Composer 自動加載原理)。
"autoload": { "classmap": [ "database/seeds", "database/factories", "sdk/Org/Net/IpLocation.class.php" ]},
添加后執行 composer dump-autoload
基本使用
$ip = new OrgNetIpLocation('UTFWry.dat'); $location = $ip->getlocation('223.104.1.100'); dd($location);
1. 標準返回值
我們拿 廣東深圳 的 ip 做示例
#?打印結果 array:5?[ "ip"?=>?"223.104.1.100" "beginip"?=>?"223.104.1.0" "endip"?=>?"223.104.1.255" "country"?=>?"廣東省深圳市" "area"?=>?"移動"]
2. 個別地區返回值有所不同,左側為示范ip,右側為返回地區名稱
#?直轄市 '223.104.3.155',//北京市? '223.104.7.155',//天津市? '223.104.25.155',//重慶市? '223.104.5.200',//上海市徐匯區? #?自治區 '223.104.15.100',//內蒙古呼和浩特市? '223.104.29.100',//寧夏銀川市? '223.104.30.100',//新疆烏魯木齊市? '211.139.74.100',//西藏拉薩市? '218.204.63.100',//廣西百色市? '1.32.192.100',//香港? '60.246.49.100',//澳門
封裝一個返回地區id的方法函數
經常使用的話,一般喜歡放在 appHelpers.php 中,
<?php function get_ip_location($ip){ $ip_driver = new OrgNetIpLocation('UTFWry.dat'); $location = $ip_driver->getlocation($ip); ????$location?=?$location['country'];?//廣東省深圳市 ????//?如果沒有查詢到的默認返回值 ????$default?=?['p_id'=>1,'c_id'=>0,'locname'=>'北京']; ????//?如果有市?那么市后邊的字符刪除?只保留到市 ????$city_strpos?=?mb_strpos($location,?'市'); ????if($city_strpos){ ????????$location?=?mb_substr($location,?0,?$city_strpos?+?1); ????} ????//?如果是直轄市,若匹配到直接返回,不繼續匹配?“區” ????$spacial?=?['北京','上海','天津','重慶'];//北京市/天津市/重慶市/上海市徐匯區 ????foreach?($spacial?as?$bj)?{ ????????if(?strpos($location,?$bj)?!==?false?){ ????????????$province_name?=?$bj; ????????????$province_id?=?DB::table('loc_province')->where('name',$province_name)->value('province_id'); ????????????return?['p_id'=>$province_id,'c_id'=>0,'locname'=>$bj.'市']; ????????} ????} ????//?其他標準查詢 ????$expect_ids?=?[36,37,38,39,69];?//排除北京、、以及想要排除的地區 ????$province_name?=?$city_name?=?'';?//初始化 ????$province_id?=?$city_id?=?0; ????//?所有省數據 ????$all_province?=?DB::table('loc_province')->whereNotIn('id',?$expect_ids)->get(); ????foreach?($all_province?as?$prov)?{ ????????$name?=?$prov->name; ????????$prov_pos?=?mb_strpos($location,?$name); ????????//?如果匹配到目標 ????????if(?$prov_pos?!==?false?){ ????????????$province_id?=?$prov->province_id; ????????????$province_name?=?$name; ????????????//?從字符串中去除省名稱,并把省字去掉 ????????????$location?=?mb_substr($location,?$prov_pos?+?mb_strlen($name)); ????????????$location?=?str_replace('省','',$location); ????????????//?如果有“市”,那么就提取出市的名稱 ????????????if($location?&&?mb_strpos($location,?'市')){ ????????????????$city_name?=?rtrim($location,?'市'); ????????????} ????????????if($city_name){ ????????????????$city_id?=?DB::table('loc_city')->where('name',$city_name)->value('cid'); ????????????}else{ ????????????????$city_id?=?1;?//?默認省會 ????????????} ????????????break; ????????} ????} ????if($province_name){ ????????return??['p_id'=>$province_id,'c_id'=>$city_id,'locname'=>$province_name.$city_name]; ????}else{ ????????return?$default; ????} }
測試
$testips?=?[ ????'223.104.3.155',//北京市? ????'223.104.7.155',//天津市? ????'223.104.25.155',//重慶市? ????'223.104.5.200',//上海市徐匯區? ????'223.104.15.100',//內蒙古呼和浩特市? ????'223.104.29.100',//寧夏銀川市? ????'223.104.30.100',//新疆烏魯木齊市? ????'211.139.74.100',//西藏拉薩市? ????'218.204.63.100',//廣西百色市? ????'1.32.192.100',//香港? ????'60.246.49.100',//澳門 ????'223.104.1.100',?//廣東省深圳市 ]; echo?"<pre class="brush:php;toolbar:false">"; foreach ($testips as $ip) { print_r(get_ip_location($ip)); }
檢查結果
Array ( ????[p_id]?=>?1 ????[c_id]?=>?0 ????[locname]?=>?北京市 ) Array ( ????[p_id]?=>?3 ????[c_id]?=>?0 ????[locname]?=>?天津市 ) Array ( ????[p_id]?=>?4 ????[c_id]?=>?0 ????[locname]?=>?重慶市 ) Array ( ????[p_id]?=>?2 ????[c_id]?=>?0 ????[locname]?=>?上海市 ) Array ( ????[p_id]?=>?7 ????[c_id]?=>?1 ????[locname]?=>?內蒙古呼和浩特 ) Array ( ????[p_id]?=>?29 ????[c_id]?=>?1 ????[locname]?=>?寧夏銀川 ) Array ( ????[p_id]?=>?31 ????[c_id]?=>?1 ????[locname]?=>?新疆烏魯木齊 ) Array ( ????[p_id]?=>?26 ????[c_id]?=>?1 ????[locname]?=>?西藏拉薩 ) Array ( ????[p_id]?=>?21 ????[c_id]?=>?13 ????[locname]?=>?廣西百色 ) Array ( ????[p_id]?=>?32 ????[c_id]?=>?1 ????[locname]?=>?香港 ) Array ( ????[p_id]?=>?33 ????[c_id]?=>?1 ????[locname]?=>?澳門 ) Array ( ????[p_id]?=>?20 ????[c_id]?=>?2 ????[locname]?=>?廣東深圳 )
原文地址:https://learnku.com/articles/52456
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦