While writing some software for work which works out distances between geographic locations, I discovered some nastiness with the natsort() function in php.

This function implements a sort algorithm that orders alphanumeric strings in the way a human being would while maintaining key/value associations. This is described as a "natural ordering".

So, given this definition of natsort, I’ll now outline a working example and then an example of the problem I encountered. Lets say we have a list of values in an array that need to be sorted descending whilst maintaining key/value pairs. E.g:

``````\$a = array(4 => 9.1, 3 => 4.2, 10 => 4.5);
natsort(\$a);``````

As you would expect, the resulting array looks a little something like this.

``````print_r(\$a);
Array
(
 => 4.2
 => 4.5
 => 9.1
)``````

But what happens when the values in the array we are trying to sort are a little more complex:

``````\$a = array(4 => 9.11705244995,3 => 4.23956628237,10 => 4.5361796771);
natsort(\$a);``````

The resulting array isn’t what we expect though.

``````print_r(\$a);
Array
(
 => 4.5361796771
 => 4.23956628237
 => 9.11705244995
)``````

As you can see, the sort order is incorrect. As you have probably picked up, the 4.5xxx number’s decimal places are 1 less than the other two numbers. As soon as you change 4.5361796771 to 4.53617967711 and run `natsort()` over it, it returns the correct order.

Conclusion: Don’t use `natsort()` when sorting floats of different precision as it will return incorrect values! Use something like `asort()` if you want to maintain key/value pairs, or `sort()` if you don’t care about the key ordering.