PHP Естественная сортировка по массиву адресов - PullRequest
1 голос
/ 27 января 2020

Привет У меня возникли проблемы с сортировкой массива. Я звоню в API, и данные, которые я получаю, выглядят примерно так:

array:41 [
  0 => StreetData {#251
    +house: "1 Some Street"
    +street: ""
  }
  1 => StreetData {#236
    +house: "11 Some Street"
    +street: ""
  }
  2 => StreetData {#236
    +house: "4 Some Street"
    +street: ""
  }
]

Я пытаюсь выполнить естественную сортировку, поэтому пытаюсь

ksort($address->streets);

Это не похоже на изменить что-нибудь. То, что я ищу, - это в основном естественный поиск. Так что номера должны учитываться сначала, а потом улица. Так что для вышесказанного я бы ожидал, что оно будет

array:41 [
  0 => StreetData {#251
    +house: "1 Some Street"
    +street: ""
  }
  1 => StreetData {#236
    +house: "4 Some Street"
    +street: ""
  }
  2 => StreetData {#236
    +house: "11 Some Street"
    +street: ""
  }
]

Поскольку 11 больше 4. Это довольно расплывчатый пример, очевидно, я ожидаю, что будет 2, 3 и c.

Итак, как мне добиться этого естественного типа сортировки?

Спасибо

1 Ответ

2 голосов
/ 27 января 2020

Я думаю, вам нужно strnatcmp и usort.

<?php
    class StreetData
    {
        public $house;
        public $street;

        public function StreetData($a, $b)
        {
            $this->house = $a;
            $this->street = $b;
        }
    }

    $arr = array(
        new StreetData("1 Some Street", ""),
        new StreetData("11 Some Street", ""),
        new StreetData("4 Some Street", ""),
    );

    function mySort($a, $b)
    {
        return strnatcmp($a->house, $b->house);
    }

    usort($arr, "mySort");

    var_dump($arr);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...