I needed to take a string, such as "255.255.255.0/24" and get an array containing every value from "255.255.255.0" to "255.255.255.255".
This is the question that I found, from 2013: https://stackoverflow.com/questions/15521725/php-generate-ips-list-from-ip-range/15613770#15613770
Edmhs answered their own question, with a function:
function ipListFromRange($range){
$parts = explode('/',$range);
$exponent = 32-$parts[1].'-';
$count = pow(2,$exponent);
$start = ip2long($parts[0]);
$end = $start+$count;
return array_map('long2ip', range($start, $end) );
}
In 2024 this throws the following error: PHP Notice: A non well formed numeric value encountered
.
This is because of the $exponent
variable, which has a "-" appended to it. I am not quite sure why this was necessary at the time of writing. pow()
is a function that only takes two arguments:
num
The base to use
exponent
The exponent
My understanding, based on the documentation, is that this needs to be a numeric value:
pow(1.932, -2.47273);
=> 0.19623732221968
Anyway, I wanted to reply to that comment and provide a solution to that error, but due to "low reputation" and general gatekeeping on Stack Overflow, I'm putting my response on Gist for anyone who ended up in the same situation that I did. Hopefully search engines can pick it up.
The solution is to make some adjustments to $exponent
and, if you want a range from .0 to .255 (256 results) when /24 is supplied, then you also need to adjust $end to be subtracted by 1 (otherwise it gives you the first result of the next octet.)
Here's my new function:
/**
* A modified ipListFromRange function that takes a range in the form of a string (255.255.255.0/24) and converts it to an
* array of values.
*
* @author Edmhs (https://stackoverflow.com/users/403411/edmhs)
* @link https://stackoverflow.com/a/15613770
* @param string $range
* @return array
*/
function ipListFromRange($range = '') {
$parts = explode('/', $range);
$exponent = 32 - $parts[1];
$count = pow(2, $exponent);
$start = ip2long($parts[0]);
$end = $start + $count;
$map = array_map('long2ip', range($start, $end - 1));
return $map;
}
The result:
array(256) {
[0]=>
string(13) "255.255.255.0"
[1]=>
string(13) "255.255.255.1"
[2]=>
string(13) "255.255.255.2"
[3]=>
string(13) "255.255.255.3"
[4]=>
string(13) "255.255.255.4"
[5]=>
string(13) "255.255.255.5"
[6]=>
string(13) "255.255.255.6"
[7]=>
string(13) "255.255.255.7"
[8]=>
string(13) "255.255.255.8"
[9]=>
string(13) "255.255.255.9"
[10]=>
string(14) "255.255.255.10"
[11]=>
string(14) "255.255.255.11"
[12]=>
string(14) "255.255.255.12"
[13]=>
string(14) "255.255.255.13"
[14]=>
string(14) "255.255.255.14"
[15]=>
string(14) "255.255.255.15"
[16]=>
string(14) "255.255.255.16"
[17]=>
string(14) "255.255.255.17"
[18]=>
string(14) "255.255.255.18"
[19]=>
string(14) "255.255.255.19"
[20]=>
string(14) "255.255.255.20"
[21]=>
string(14) "255.255.255.21"
[22]=>
string(14) "255.255.255.22"
[23]=>
string(14) "255.255.255.23"
[24]=>
string(14) "255.255.255.24"
[25]=>
string(14) "255.255.255.25"
[26]=>
string(14) "255.255.255.26"
[27]=>
string(14) "255.255.255.27"
[28]=>
string(14) "255.255.255.28"
[29]=>
string(14) "255.255.255.29"
[30]=>
string(14) "255.255.255.30"
[31]=>
string(14) "255.255.255.31"
[32]=>
string(14) "255.255.255.32"
[33]=>
string(14) "255.255.255.33"
[34]=>
string(14) "255.255.255.34"
[35]=>
string(14) "255.255.255.35"
[36]=>
string(14) "255.255.255.36"
[37]=>
string(14) "255.255.255.37"
[38]=>
string(14) "255.255.255.38"
[39]=>
string(14) "255.255.255.39"
[40]=>
string(14) "255.255.255.40"
[41]=>
string(14) "255.255.255.41"
[42]=>
string(14) "255.255.255.42"
[43]=>
string(14) "255.255.255.43"
[44]=>
string(14) "255.255.255.44"
[45]=>
string(14) "255.255.255.45"
[46]=>
string(14) "255.255.255.46"
[47]=>
string(14) "255.255.255.47"
[48]=>
string(14) "255.255.255.48"
[49]=>
string(14) "255.255.255.49"
[50]=>
string(14) "255.255.255.50"
[51]=>
string(14) "255.255.255.51"
[52]=>
string(14) "255.255.255.52"
[53]=>
string(14) "255.255.255.53"
[54]=>
string(14) "255.255.255.54"
[55]=>
string(14) "255.255.255.55"
[56]=>
string(14) "255.255.255.56"
[57]=>
string(14) "255.255.255.57"
[58]=>
string(14) "255.255.255.58"
[59]=>
string(14) "255.255.255.59"
[60]=>
string(14) "255.255.255.60"
[61]=>
string(14) "255.255.255.61"
[62]=>
string(14) "255.255.255.62"
[63]=>
string(14) "255.255.255.63"
[64]=>
string(14) "255.255.255.64"
[65]=>
string(14) "255.255.255.65"
[66]=>
string(14) "255.255.255.66"
[67]=>
string(14) "255.255.255.67"
[68]=>
string(14) "255.255.255.68"
[69]=>
string(14) "255.255.255.69"
[70]=>
string(14) "255.255.255.70"
[71]=>
string(14) "255.255.255.71"
[72]=>
string(14) "255.255.255.72"
[73]=>
string(14) "255.255.255.73"
[74]=>
string(14) "255.255.255.74"
[75]=>
string(14) "255.255.255.75"
[76]=>
string(14) "255.255.255.76"
[77]=>
string(14) "255.255.255.77"
[78]=>
string(14) "255.255.255.78"
[79]=>
string(14) "255.255.255.79"
[80]=>
string(14) "255.255.255.80"
[81]=>
string(14) "255.255.255.81"
[82]=>
string(14) "255.255.255.82"
[83]=>
string(14) "255.255.255.83"
[84]=>
string(14) "255.255.255.84"
[85]=>
string(14) "255.255.255.85"
[86]=>
string(14) "255.255.255.86"
[87]=>
string(14) "255.255.255.87"
[88]=>
string(14) "255.255.255.88"
[89]=>
string(14) "255.255.255.89"
[90]=>
string(14) "255.255.255.90"
[91]=>
string(14) "255.255.255.91"
[92]=>
string(14) "255.255.255.92"
[93]=>
string(14) "255.255.255.93"
[94]=>
string(14) "255.255.255.94"
[95]=>
string(14) "255.255.255.95"
[96]=>
string(14) "255.255.255.96"
[97]=>
string(14) "255.255.255.97"
[98]=>
string(14) "255.255.255.98"
[99]=>
string(14) "255.255.255.99"
[100]=>
string(15) "255.255.255.100"
[101]=>
string(15) "255.255.255.101"
[102]=>
string(15) "255.255.255.102"
[103]=>
string(15) "255.255.255.103"
[104]=>
string(15) "255.255.255.104"
[105]=>
string(15) "255.255.255.105"
[106]=>
string(15) "255.255.255.106"
[107]=>
string(15) "255.255.255.107"
[108]=>
string(15) "255.255.255.108"
[109]=>
string(15) "255.255.255.109"
[110]=>
string(15) "255.255.255.110"
[111]=>
string(15) "255.255.255.111"
[112]=>
string(15) "255.255.255.112"
[113]=>
string(15) "255.255.255.113"
[114]=>
string(15) "255.255.255.114"
[115]=>
string(15) "255.255.255.115"
[116]=>
string(15) "255.255.255.116"
[117]=>
string(15) "255.255.255.117"
[118]=>
string(15) "255.255.255.118"
[119]=>
string(15) "255.255.255.119"
[120]=>
string(15) "255.255.255.120"
[121]=>
string(15) "255.255.255.121"
[122]=>
string(15) "255.255.255.122"
[123]=>
string(15) "255.255.255.123"
[124]=>
string(15) "255.255.255.124"
[125]=>
string(15) "255.255.255.125"
[126]=>
string(15) "255.255.255.126"
[127]=>
string(15) "255.255.255.127"
[128]=>
string(15) "255.255.255.128"
[129]=>
string(15) "255.255.255.129"
[130]=>
string(15) "255.255.255.130"
[131]=>
string(15) "255.255.255.131"
[132]=>
string(15) "255.255.255.132"
[133]=>
string(15) "255.255.255.133"
[134]=>
string(15) "255.255.255.134"
[135]=>
string(15) "255.255.255.135"
[136]=>
string(15) "255.255.255.136"
[137]=>
string(15) "255.255.255.137"
[138]=>
string(15) "255.255.255.138"
[139]=>
string(15) "255.255.255.139"
[140]=>
string(15) "255.255.255.140"
[141]=>
string(15) "255.255.255.141"
[142]=>
string(15) "255.255.255.142"
[143]=>
string(15) "255.255.255.143"
[144]=>
string(15) "255.255.255.144"
[145]=>
string(15) "255.255.255.145"
[146]=>
string(15) "255.255.255.146"
[147]=>
string(15) "255.255.255.147"
[148]=>
string(15) "255.255.255.148"
[149]=>
string(15) "255.255.255.149"
[150]=>
string(15) "255.255.255.150"
[151]=>
string(15) "255.255.255.151"
[152]=>
string(15) "255.255.255.152"
[153]=>
string(15) "255.255.255.153"
[154]=>
string(15) "255.255.255.154"
[155]=>
string(15) "255.255.255.155"
[156]=>
string(15) "255.255.255.156"
[157]=>
string(15) "255.255.255.157"
[158]=>
string(15) "255.255.255.158"
[159]=>
string(15) "255.255.255.159"
[160]=>
string(15) "255.255.255.160"
[161]=>
string(15) "255.255.255.161"
[162]=>
string(15) "255.255.255.162"
[163]=>
string(15) "255.255.255.163"
[164]=>
string(15) "255.255.255.164"
[165]=>
string(15) "255.255.255.165"
[166]=>
string(15) "255.255.255.166"
[167]=>
string(15) "255.255.255.167"
[168]=>
string(15) "255.255.255.168"
[169]=>
string(15) "255.255.255.169"
[170]=>
string(15) "255.255.255.170"
[171]=>
string(15) "255.255.255.171"
[172]=>
string(15) "255.255.255.172"
[173]=>
string(15) "255.255.255.173"
[174]=>
string(15) "255.255.255.174"
[175]=>
string(15) "255.255.255.175"
[176]=>
string(15) "255.255.255.176"
[177]=>
string(15) "255.255.255.177"
[178]=>
string(15) "255.255.255.178"
[179]=>
string(15) "255.255.255.179"
[180]=>
string(15) "255.255.255.180"
[181]=>
string(15) "255.255.255.181"
[182]=>
string(15) "255.255.255.182"
[183]=>
string(15) "255.255.255.183"
[184]=>
string(15) "255.255.255.184"
[185]=>
string(15) "255.255.255.185"
[186]=>
string(15) "255.255.255.186"
[187]=>
string(15) "255.255.255.187"
[188]=>
string(15) "255.255.255.188"
[189]=>
string(15) "255.255.255.189"
[190]=>
string(15) "255.255.255.190"
[191]=>
string(15) "255.255.255.191"
[192]=>
string(15) "255.255.255.192"
[193]=>
string(15) "255.255.255.193"
[194]=>
string(15) "255.255.255.194"
[195]=>
string(15) "255.255.255.195"
[196]=>
string(15) "255.255.255.196"
[197]=>
string(15) "255.255.255.197"
[198]=>
string(15) "255.255.255.198"
[199]=>
string(15) "255.255.255.199"
[200]=>
string(15) "255.255.255.200"
[201]=>
string(15) "255.255.255.201"
[202]=>
string(15) "255.255.255.202"
[203]=>
string(15) "255.255.255.203"
[204]=>
string(15) "255.255.255.204"
[205]=>
string(15) "255.255.255.205"
[206]=>
string(15) "255.255.255.206"
[207]=>
string(15) "255.255.255.207"
[208]=>
string(15) "255.255.255.208"
[209]=>
string(15) "255.255.255.209"
[210]=>
string(15) "255.255.255.210"
[211]=>
string(15) "255.255.255.211"
[212]=>
string(15) "255.255.255.212"
[213]=>
string(15) "255.255.255.213"
[214]=>
string(15) "255.255.255.214"
[215]=>
string(15) "255.255.255.215"
[216]=>
string(15) "255.255.255.216"
[217]=>
string(15) "255.255.255.217"
[218]=>
string(15) "255.255.255.218"
[219]=>
string(15) "255.255.255.219"
[220]=>
string(15) "255.255.255.220"
[221]=>
string(15) "255.255.255.221"
[222]=>
string(15) "255.255.255.222"
[223]=>
string(15) "255.255.255.223"
[224]=>
string(15) "255.255.255.224"
[225]=>
string(15) "255.255.255.225"
[226]=>
string(15) "255.255.255.226"
[227]=>
string(15) "255.255.255.227"
[228]=>
string(15) "255.255.255.228"
[229]=>
string(15) "255.255.255.229"
[230]=>
string(15) "255.255.255.230"
[231]=>
string(15) "255.255.255.231"
[232]=>
string(15) "255.255.255.232"
[233]=>
string(15) "255.255.255.233"
[234]=>
string(15) "255.255.255.234"
[235]=>
string(15) "255.255.255.235"
[236]=>
string(15) "255.255.255.236"
[237]=>
string(15) "255.255.255.237"
[238]=>
string(15) "255.255.255.238"
[239]=>
string(15) "255.255.255.239"
[240]=>
string(15) "255.255.255.240"
[241]=>
string(15) "255.255.255.241"
[242]=>
string(15) "255.255.255.242"
[243]=>
string(15) "255.255.255.243"
[244]=>
string(15) "255.255.255.244"
[245]=>
string(15) "255.255.255.245"
[246]=>
string(15) "255.255.255.246"
[247]=>
string(15) "255.255.255.247"
[248]=>
string(15) "255.255.255.248"
[249]=>
string(15) "255.255.255.249"
[250]=>
string(15) "255.255.255.250"
[251]=>
string(15) "255.255.255.251"
[252]=>
string(15) "255.255.255.252"
[253]=>
string(15) "255.255.255.253"
[254]=>
string(15) "255.255.255.254"
[255]=>
string(15) "255.255.255.255"
}
This works for my use case, but I am not sure it works for all use cases.