No need for calculations or loops - this is very easy to do with PHPs date functions:
Find the the Nth or Last occurrence of a particular day in a month as follows:
/////////////////////////////////////////////////////////////////
// Setup
/////////////////////////////////////////////////////////////////
// Specify the month of which we are interested.
// You can use any timestamp inside that month.
// I'm using the current time as an example, so it will use the current month.
$DateTS = time();
// The day of interest, ie: Friday.
// It can be 0=Sunday through 6=Saturday (Like 'w' from date()).
// I'll use Monday for example.
$Day = 1;
// The occurance of this day in which we are interested.
// It can be 1, 2, 3, 4 for the first, second, third, and fourth occurence of the day in question in the month in question.
// You can also use -1 to fine the LAST occurence. That will return the fifth occurrence if there is one, else the 4th.
// I will use the 2nd occurrence as example.
$Ord = 2;
////////////////////////////////////////////////////////////////
// We now have all the specific values we need.
// The example values above specify the 2nd Monday in the current month
////////////////////////////////////////////////////////////////
// We need the day name that corresponds with our day number to pass to strtotime().
// We could just specify the string in the first place, but for date calcs, you are more likely to have the day number than the string itself.
$Names = array( 0=>"Sun", 1=>"Mon", 2=>"Tue", 3=>"Wed", 4=>"Thu", 5=>"Fri", 6=>"Sat" );
// Calculate the the first of the month in question, relative to $DateTS. It will be the timestamp of midnight (00:00).
$ThisMonthTS = strtotime( date("Y-m-01", $DateTS ) );
// Calculate the first of the FOLLOWING month, relative to $DateTS. Also timestamp of midnight.
// This will be used if we specify -1 for last occurrence.
$NextMonthTS = strtotime( date("Y-m-01", strtotime("next month", $DateTS) ) );
// Now we just format the values a bit and pass them to strtotime().
// To find the 1,2,3,4th occurrence, we work from the first of the month forward.
// For the last (-1) occurence,work we work back from the first of the following month.
$DateOfInterest = (-1 == $Ord) ?
strtotime( "last ".$Names[$Day], $NextMonthTS ) : // The last occurrence of the day in this month. Calculated as "last dayname" from the first of next month, which will be the last one in this month.
strtotime( $Names[$Day]." + ".($Ord-1)." weeks", $ThisMonthTS ); // From the first of this month, move to "next dayname" which will be the first occurrence, and then move ahead a week for as many additional occurrences as you need.
// You can view the result with this code. Just change $DateTS, $Day, and $Ord to your desired values and run it.
echo( "Month: ".date("Y-m", $DateTS)."<br />");
echo( "Ord: ".$Ord."<br />");
echo( "Day: ".$Names[$Day]."<br /><br />");
echo("Date of Interest: ".date("l, F jS, Y", $DateOfInterest));