NYCPHP Meetup

NYPHP.org

[nycphp-talk] Getting Closure - on PHP Closures and 5.3

John Campbell jcampbell1 at gmail.com
Fri Jul 16 16:36:29 EDT 2010


On Fri, Jul 16, 2010 at 2:48 PM, Hans Zaunere <lists at zaunere.com> wrote:
> Closures - great for Javascript, but for PHP?  In a non-callback-centric
> synchronous language such as PHP, what else can we use this "syntactic
> sugar" for?  How are people using them and what can we gain from them?  And,
> the hell with code reuse?

I have a favorite problem, that is hard/ugly to solve without closures:

Given an array of businesses with latitude/longitude coordinates, and
the user's location, sort the array of businesses by closest to the
user.

so you have:

$stores = array(
  array('name' => 'Pet Smart', 'lat'=>24.12, 'lon' => 54.23),
  array('name' => 'Cats and Critter', 'lat'=>24.19, 'lon' => 54.32),
  array('name' => 'Snakes and such', 'lat'=>24.45, 'lon' => 53.35),
  array('name' => 'Lots of llams', 'lat'=>24.46, 'lon' => 54.97));

$user_location = array('lat'=> 24.45, 'lon' => 54.96);

// Solution using closures

// geo sort.
function sort_by_closest(&$points,$location) {
  usort($points, function($a,$b) use($location) {
    return distance($a,$location) > distance($b,$location);
  });
}

// geo distance using sperical law of cosines.
function distance($a,$b) {
	$R = 6371; // km
	$d2r = pi() / 180;
	return acos(sin($a['lat']*$d2r)*sin($b['lat']*$d2r) +
	                  cos($a['lat']*$d2r)*cos($b['lat']*$d2r) *
	                  cos($b['lon']*$d2r-$a['lon']*$d2r)) * $R;
}

print_r($stores);
sort_by_closest($stores,$user_location);
print_r($stores);


-John



More information about the talk mailing list