在laravel項目中根據IP獲取省市名稱

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

下面由laravel框架教程欄目給大家介紹根據IP獲取省市名稱的方法,希望對需要的朋友有所幫助!

在laravel項目中根據IP獲取省市名稱

根據 ip 獲取地理定位,曾嘗試了 laravel的torann/geoip 包,不是很準確。還有 百度 api 調用獲取地理信息的方法,為了減少維護成本,最終用了thinkphp3.2 中的一個包,是否是tp框架自帶的不很清楚。這個包獲取定位的原理是內置了省市數據庫 utfwry.dat。

在laravel項目中根據IP獲取省市名稱

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(&#39;UTFWry.dat&#39;);     $location = $ip_driver->getlocation($ip); ????$location?=?$location['country'];?//廣東省深圳市  ????//?如果沒有查詢到的默認返回值 ????$default?=?['p_id'=&gt;1,'c_id'=&gt;0,'locname'=&gt;'北京'];  ????//?如果有市?那么市后邊的字符刪除?只保留到市 ????$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')-&gt;where('name',$province_name)-&gt;value('province_id'); ????????????return?['p_id'=&gt;$province_id,'c_id'=&gt;0,'locname'=&gt;$bj.'市']; ????????} ????}  ????//?其他標準查詢 ????$expect_ids?=?[36,37,38,39,69];?//排除北京、、以及想要排除的地區 ????$province_name?=?$city_name?=?'';?//初始化 ????$province_id?=?$city_id?=?0; ????//?所有省數據 ????$all_province?=?DB::table('loc_province')-&gt;whereNotIn('id',?$expect_ids)-&gt;get(); ????foreach?($all_province?as?$prov)?{ ????????$name?=?$prov-&gt;name; ????????$prov_pos?=?mb_strpos($location,?$name); ????????//?如果匹配到目標 ????????if(?$prov_pos?!==?false?){ ????????????$province_id?=?$prov-&gt;province_id; ????????????$province_name?=?$name; ????????????//?從字符串中去除省名稱,并把省字去掉 ????????????$location?=?mb_substr($location,?$prov_pos?+?mb_strlen($name)); ????????????$location?=?str_replace('省','',$location); ????????????//?如果有“市”,那么就提取出市的名稱 ????????????if($location?&amp;&amp;?mb_strpos($location,?'市')){ ????????????????$city_name?=?rtrim($location,?'市'); ????????????} ????????????if($city_name){ ????????????????$city_id?=?DB::table('loc_city')-&gt;where('name',$city_name)-&gt;value('cid'); ????????????}else{ ????????????????$city_id?=?1;?//?默認省會 ????????????}  ????????????break; ????????} ????}  ????if($province_name){ ????????return??['p_id'=&gt;$province_id,'c_id'=&gt;$city_id,'locname'=&gt;$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]?=&gt;?1 ????[c_id]?=&gt;?0 ????[locname]?=&gt;?北京市 ) Array ( ????[p_id]?=&gt;?3 ????[c_id]?=&gt;?0 ????[locname]?=&gt;?天津市 ) Array ( ????[p_id]?=&gt;?4 ????[c_id]?=&gt;?0 ????[locname]?=&gt;?重慶市 ) Array ( ????[p_id]?=&gt;?2 ????[c_id]?=&gt;?0 ????[locname]?=&gt;?上海市 ) Array ( ????[p_id]?=&gt;?7 ????[c_id]?=&gt;?1 ????[locname]?=&gt;?內蒙古呼和浩特 ) Array ( ????[p_id]?=&gt;?29 ????[c_id]?=&gt;?1 ????[locname]?=&gt;?寧夏銀川 ) Array ( ????[p_id]?=&gt;?31 ????[c_id]?=&gt;?1 ????[locname]?=&gt;?新疆烏魯木齊 ) Array ( ????[p_id]?=&gt;?26 ????[c_id]?=&gt;?1 ????[locname]?=&gt;?西藏拉薩 ) Array ( ????[p_id]?=&gt;?21 ????[c_id]?=&gt;?13 ????[locname]?=&gt;?廣西百色 ) Array ( ????[p_id]?=&gt;?32 ????[c_id]?=&gt;?1 ????[locname]?=&gt;?香港 ) Array ( ????[p_id]?=&gt;?33 ????[c_id]?=&gt;?1 ????[locname]?=&gt;?澳門 ) Array ( ????[p_id]?=&gt;?20 ????[c_id]?=&gt;?2 ????[locname]?=&gt;?廣東深圳 )

原文地址:https://learnku.com/articles/52456

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

以上就是在

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享