I don't believe it is possible to code a search over sorted data with duplicates that comes even close to be O(log N). Even in theory.
You're wrong. You can easily find the smallest index containing your target value by using a condition like:
return $i if $A[$i] == $target && ($i == 0 || $A[$i-1] < $target);
instead of the usual
return $i if $A[$i] == $target;
And you find the highest index by using:
return $i if $A[$i] == $target && ($i == $#A || $A[$i+1] > $target);
It doesn't increase the run time complexity - the worst case of a binary search is when no match is found anyway.