Nearest helper
You can view the source on GitHub.
To initialise with a profile:
$nearest = new nearest('users');
Or to create with a config array:
$nearest = new nearest(array( 'max_results' => 10, ));
Exmple 1
To find the records closest to a particular location, just call:
$results = $nearest->locations_nearest($postcode); $results = $nearest->locations_nearest(['latitude' => $latitude, 'longitude' => $longitude]);
By default this will use the Google Geocode service.
Where the config could be something like:
$config['nearest.users.table_sql'] = $config['db.prefix'] . 'user'; $config['nearest.users.where_sql'] = 'address_postcode != "" AND deleted = "0000-00-00 00:00:00"'; $config['nearest.users.field_postcode_sql'] = 'address_postcode'; $config['nearest.users.field_latitude_sql'] = 'location_latitude'; $config['nearest.users.field_longitude_sql'] = 'location_longitude'; $config['nearest.users.extra_fields_sql'] = []; $config['nearest.users.max_results'] = 10; $config['nearest.users.max_km'] = 0; // Unlimited $config['nearest.gm_key'] = ''; // Can leave blank to use Google Maps, or get a key from: // https://console.developers.google.com
Example 2
If you have a more complicated source, then you can pass in an array of results:
$nearest = new nearest(array( 'field_latitude' => 'latitude', 'field_longitude' => 'longitude', 'max_results' => 0, // Unlimited 'max_km' => 0, // Unlimited )); // $results = array(array( // 'name' => 'A', // 'latitude' => 50.54, // 'longitude' => -2.596, // )); $results = $nearest->locations_distance($results, $postcode); array_key_sort($locations, 'distance', SORT_NUMERIC, SORT_ASC);
The results are just modified to set a 'distance' key (either in km, or NULL for unknown).
And because we have not set a limit on the results, we could use the paginator:
$paginator = new paginator(); $results = $paginator->limit_array($results);
Or if you do want to limit the results:
$results = $nearest->locations_limited($results, $postcode);
To initialise the lat/long values for a table with only a postcode field:
$nearest = new nearest('users'); $nearest->update_init(30);
Note that this will only update 30 records at a time, as the external API will probably be rate limited.
This could go in as a temporary maintenance job, to be removed when all records have been updated.