Determine state from postcode in Australia
I had a little dilemma where I was importing a list of stores, but a required field was state. I had the postcodes for all these stores so I figured I could determine the state. I’ve dealt with postcode data before but I really couldn’t be bothered downloading that database from Australia Post (it’s pretty big). I’ve always known that postcodes starting with 2 are in NSW, 3 are in VIC, 4 are in QLD etc. so I set out to find what exactly determines the state from postcode.
The result was this article http://en.wikipedia.org/wiki/Postcodes_in_Australia#States_and_territories
And the PHP function is:
/** /** * Returns the state for a postcode. * eg. NSW * * @link http://en.wikipedia.org/wiki/Postcodes_in_Australia#States_and_territories */ function findState($postcode) { $ranges = array( 'NSW' => array( 1000, 1999, 2000, 2599, 2619, 2898, 2921, 2999 ), 'ACT' => array( 200, 299, 2600, 2618, 2900, 2920 ), 'VIC' => array( 3000, 3999, 8000, 8999 ), 'QLD' => array( 4000, 4999, 9000, 9999 ), 'SA' => array( 5000, 5999 ), 'WA' => array( 6000, 6797, 6800, 6999 ), 'TAS' => array( 7000, 7999 ), 'NT' => array( 800, 999 ) ); $exceptions = array( 872 => 'NT', 2540 => 'NSW', 2611 => 'ACT', 2620 => 'NSW', 3500 => 'VIC', 3585 => 'VIC', 3586 => 'VIC', 3644 => 'VIC', 3707 => 'VIC', 2899 => 'NSW', 6798 => 'WA', 6799 => 'WA', 7151 => 'TAS' ); $postcode = intval($postcode); if ( array_key_exists($postcode, $exceptions) ) { return $exceptions[$postcode]; } foreach ($ranges as $state => $range) { $c = count($range); for ($i = 0; $i < $c; $i+=2) { $min = $range[$i]; $max = $range[$i+1]; if ( $postcode >= $min && $postcode <= $max ) { return $state; } } } return null; }
One Comment
hi there,
i noticed an error in your code in that the exceptions always return the state within the range, as opposed to the correct state.
e.g 872 is within the NT range, but is actually in SA.