在开发中,经常需要将IP地址转成整型进行保存,这样不仅有利于做索引,并且原本需要15个字节的存储空间,
转换后只需4个字节就能存储了。不过由于ip2long只支持IPv4,所以本文也是基于IPv4来讲解的
1,使用php的内置函数ip2long()
$ip = ‘192.0.34.166‘;
echo ip2long($ip);
得到的结果 -1073732954
原因是ip2long转换的函数是有符号的,最大值为2147483647
一旦超过,就会成为负值,解决办法后面会有
2,自己写函数来转换
function ip2int($ip){
//把ip分为四段,$ip1,$ip2,$ip3,$ip4
list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip);
//然后第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256,pow是指数表达式
return $ip1*pow(256,3)+$ip2*pow(256,2)+$ip3*256+$ip4;
}
echo ip2int($ip);(两种函数得到的结果一样)
得到的结果 3221234342;
这种是可以避免出现负数的方法之一,但是使用函数略显麻烦
然后我们用long2ip来转换到刚刚转换后得到的数据值
$ip1 = long2ip(ip2long($ip));//使用内置函数ip2long
echo $ipint;//192.0.34.166
$ip2 = ip2int($ip);//使用上面自定义的函数
echo $ipint;//192.0.34.166
得到的结果是一样的,虽然结果是一样的,但是我们需要把转换成整型后的地址存到数据库中,
负值并不友好,所以需要改进,
改进方法
$ipint = sprintf(‘%u‘,ip2long($ip));//%u格式化为无符号的十进制数
echo $ipint;//3221234342
这样结果就不会出问题了