Disambiguate `Address.state_province_id:abbr` (PHP asort)
authorTim Otten <totten@civicrm.org>
Fri, 10 Feb 2023 06:18:49 +0000 (22:18 -0800)
committerTim Otten <totten@civicrm.org>
Fri, 10 Feb 2023 22:01:32 +0000 (14:01 -0800)
commit1353ce0f03cb0dc921840492b1ae48355631cd2c
tree0f326d29310988c1b16a2543ff649553939013bc
parent327bb32cda93e963a4a1800d018bd17b2e2bfb22
Disambiguate `Address.state_province_id:abbr` (PHP asort)

Consider `ContactJoinTest::testCreateWithPrimaryAndBilling` which writes the value:

  'address_billing.state_province_id:abbr' => 'AK',

The symbol 'AK' can map to three places: Akwa Ibom (Nigeria), Atakora
(Benin), and Alaska (USA).  This is an ambiguous choice.  It should be
resolved in a consistent way.

One flavor of ambiguity comes from PHP.  After fetching from MySQL, there is
a secondary sorting (via `CRM_Utils_Array::asort()` => `asort()`).  Per
https://www.php.net/asort, the outcome is quirky:

> If two members compare as equal, they retain their original order.  Prior
> to PHP 8.0.0, their relative order in the sorted array was undefined.

On PHP 7, you cannot resolve this with any of the standard sort methods
(`asort`, `usort`, `ksort`, etc). They all have the same issue.

However...  the docs for `\Collator::asort()` indicate no such issue.
Switching to `\Collator::asort()` causes the tests to pass on PHP 7.3.  And
we already use `\Collator::asort()`.
CRM/Utils/Array.php