Skip to content

Instantly share code, notes, and snippets.

@mookman288
Created February 7, 2024 20:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mookman288/9b1d0b31b556b57fb4d4b704f8110e78 to your computer and use it in GitHub Desktop.
Save mookman288/9b1d0b31b556b57fb4d4b704f8110e78 to your computer and use it in GitHub Desktop.
Stackoverflow Response to "PHP Generate IP's list from ip range"

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment