Zip code reduce function
An alternative


   protected function haversineGreatCircleDistance($latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 3959)
    {
        // convert from degrees to radians
        $latFrom = deg2rad($latitudeFrom);
        $lonFrom = deg2rad($longitudeFrom);
        $latTo = deg2rad($latitudeTo);
        $lonTo = deg2rad($longitudeTo);



You can simplify this if you only call it from the one place.  

    protected function haversineGreatCircleDistance($from, $to, $earthRadius = 3959)
    {
        // convert from degrees to radians
        $latFrom = deg2rad($from['latitude']);
        $lonFrom = deg2rad($from['longitude']);
        $latTo = deg2rad($to['latitude']);
        $lonTo = deg2rad($to['longitude']);


Not a big deal, but this is shorter.  

Avoid unnecessary variables


                $validInputZips[$zip]['hits'] = 0;



You create this purely to use for a single iteration in a later loop.  Why bother?  Create a variable in the loop and let it die after.  Or in this case, just take action in the loop and skip the variable altogether.  More on that later.  

Don't do many times what you can do once

If you do 

          $diameter = 2 * $radius;


before the nested loops, you only have to do the multiplication once.  

Keep it simple


            foreach ($maskedInputZips as $maskedZip =&gt; $maskedLatlon) {

                if ($zip != $maskedZip) {
                    $miles = $this-&gt;haversineGreatCircleDistance($latlon['latitude'], $latlon['longitude'], $maskedLatlon['latitude'], $maskedLatlon['longitude'], 3959);

                    if ($miles &lt; ($radius * 2)) {
                        $validInputZips[$zip]['hits'] += 1;
                    }
                }
            }
            if ($validInputZips[$zip]['hits'] == 0){
                $outputArray[] = $zip;
            }



You can simplify this as 

            foreach ($maskedInputZips as $maskedZip =&gt; $maskedLatlon) {

                if ($zip != $maskedZip) {
                    $miles = $this-&gt;haversineGreatCircleDistance($latlon, $maskedLatlon);

                    if ($miles &lt; $diameter) {
                        continue 2;
                    }
                }
            }

            $outputArray[] = $zip;


You don't need to increment the variable, as you never use it except to check for 0.  A simple Boolean is plenty.  This skips to the next iteration of the outer loop as soon as it finds the zip that makes it unqualified.  If that never happens, we add the zip to the output.  

Careful about calling a function and explicitly entering the default value of a parameter.  When you do that, it can make it confusing as to which value matters.  The same value appears in two places, but only one matters.  What if someone changes the wrong one?