ksort() выдаёт неверный результат

Исходный массив такой:

Array
(
    [Danmark] => Country Object
        (
            [id:protected] => 39
            [name:protected] => Danmark
            [code:protected] => DK
            [stringIndex:protected] => DENMARK
        )

    [Tyskland] => Country Object
        (
            [id:protected] => 59
            [name:protected] => Tyskland
            [code:protected] => DE
            [stringIndex:protected] => GERMANY
        )

    [Irland] => Country Object
        (
            [id:protected] => 78
            [name:protected] => Irland
            [code:protected] => IE
            [stringIndex:protected] => IRELAND
        )

    [Italien] => Country Object
        (
            [id:protected] => 81
            [name:protected] => Italien
            [code:protected] => IT
            [stringIndex:protected] => ITALY
        )

    [Holland] => Country Object
        (
            [id:protected] => 119
            [name:protected] => Holland
            [code:protected] => NL
            [stringIndex:protected] => NETHERLANDS
        )

    [Nya Zeeland] => Country Object
        (
            [id:protected] => 122
            [name:protected] => Nya Zeeland
            [code:protected] => NZ
            [stringIndex:protected] => NEW_ZEALAND
        )

    [Polen] => Country Object
        (
            [id:protected] => 138
            [name:protected] => Polen
            [code:protected] => PL
            [stringIndex:protected] => POLAND
        )

    [Spanien] => Country Object
        (
            [id:protected] => 161
            [name:protected] => Spanien
            [code:protected] => ES
            [stringIndex:protected] => SPAIN
        )

    [Sverige] => Country Object
        (
            [id:protected] => 166
            [name:protected] => Sverige
            [code:protected] => SE
            [stringIndex:protected] => SWEDEN
        )

    [Schweiz] => Country Object
        (
            [id:protected] => 167
            [name:protected] => Schweiz
            [code:protected] => CH
            [stringIndex:protected] => SWITZERLAND
        )

    [England] => Country Object
        (
            [id:protected] => 185
            [name:protected] => England
            [code:protected] => GB
            [stringIndex:protected] => UNITED_KINGDOM
        )

    [Osterrike] => Country Object
        (
            [id:protected] => 197
            [name:protected] => Osterrike
            [code:protected] => AT
            [stringIndex:protected] => AUSTRIA
        )

    [Belgien] => Country Object
        (
            [id:protected] => 236
            [name:protected] => Belgien
            [code:protected] => BE
            [stringIndex:protected] => BELGIUM
        )

)

И после того, как я позвоню:

ksort($countries, SORT_STRING);

Я получаю это:

Array
(
    [Osterrike] => Country Object
        (
            [id:protected] => 197
            [name:protected] => Osterrike
            [code:protected] => AT
            [stringIndex:protected] => AUSTRIA
        )

    [Belgien] => Country Object
        (
            [id:protected] => 236
            [name:protected] => Belgien
            [code:protected] => BE
            [stringIndex:protected] => BELGIUM
        )

    [Danmark] => Country Object
        (
            [id:protected] => 39
            [name:protected] => Danmark
            [code:protected] => DK
            [stringIndex:protected] => DENMARK
        )

    [Tyskland] => Country Object
        (
            [id:protected] => 59
            [name:protected] => Tyskland
            [code:protected] => DE
            [stringIndex:protected] => GERMANY
        )

    [Irland] => Country Object
        (
            [id:protected] => 78
            [name:protected] => Irland
            [code:protected] => IE
            [stringIndex:protected] => IRELAND
        )

    [Italien] => Country Object
        (
            [id:protected] => 81
            [name:protected] => Italien
            [code:protected] => IT
            [stringIndex:protected] => ITALY
        )

    [Holland] => Country Object
        (
            [id:protected] => 119
            [name:protected] => Holland
            [code:protected] => NL
            [stringIndex:protected] => NETHERLANDS
        )

    [Nya Zeeland] => Country Object
        (
            [id:protected] => 122
            [name:protected] => Nya Zeeland
            [code:protected] => NZ
            [stringIndex:protected] => NEW_ZEALAND
        )

    [Polen] => Country Object
        (
            [id:protected] => 138
            [name:protected] => Polen
            [code:protected] => PL
            [stringIndex:protected] => POLAND
        )

    [Spanien] => Country Object
        (
            [id:protected] => 161
            [name:protected] => Spanien
            [code:protected] => ES
            [stringIndex:protected] => SPAIN
        )

    [Sverige] => Country Object
        (
            [id:protected] => 166
            [name:protected] => Sverige
            [code:protected] => SE
            [stringIndex:protected] => SWEDEN
        )

    [Schweiz] => Country Object
        (
            [id:protected] => 167
            [name:protected] => Schweiz
            [code:protected] => CH
            [stringIndex:protected] => SWITZERLAND
        )

    [England] => Country Object
        (
            [id:protected] => 185
            [name:protected] => England
            [code:protected] => GB
            [stringIndex:protected] => UNITED_KINGDOM
        )

)

Когда я тестирую его с теми же индексами, но со значениями простых строк вместо моего Country объекты, это сортирует правильно. Когда я тестирую его с теми же индексами, но с пустым Test объекты вместо моего Country объекты, опять же, он сортирует правильно. Но в данном конкретном случае он возвращает неверный результат. Они также не сортируются по каким-либо значениям внутри объекта, все значения кажутся случайными.

Country класс предельно прост:

class Country {

   protected $id;
   protected $name;
   protected $code;
   protected $stringIndex;

}

Что может быть причиной?

2 ответа

Публикация в качестве ответа, так как это будет очень уродливо в качестве комментария:

Я не могу дублировать ваши O впереди:

код:

<?php

$foo = array(
   'P' => 'regular p',
   'Ö' => 'umlaut o',
   'O' => 'regular o',
   'A' => 'regular A'
);

var_dump ($ Foo); ksort($ Foo); var_dump($ Foo);

Результат:

array(4) {
  ["P"]=>
  string(9) "regular p"
  ["Ö"]=>
  string(8) "umlaut o"
  ["O"]=>
  string(9) "regular o"
  ["A"]=>
  string(9) "regular A"
}
array(4) {
  ["A"]=>
  string(9) "regular A"
  ["O"]=>
  string(9) "regular o"
  ["P"]=>
  string(9) "regular p"
  ["Ö"]=>
  string(8) "umlaut o"
}

Как видите, Ö сортирует неправильно, но сортирует по КОНЦУ массива, а не по началу.

Я думаю, что мой ответ слишком поздно, но кажется, что массив был отсортирован по stringIndex поле Country Object.

Может быть (просто может быть, я точно не знаю) из-за флага SORT_STRING ksort пытается найти элементы с определенным string типа, но если это не удалось, то он пытается найти ключи с ключевым словом "строка", как stringIndex в стране объекта.

Другие вопросы по тегам