PHP-массив сортирует один элемент, но оставляет остальные в том же порядке

#php

#php

Вопрос:

У меня есть простой PHP-массив, который выглядит следующим образом…

 Array
    (
        [0] => WP_Term Object
            (
                [id] => 455
            )
        [1] => WP_Term Object
            (
                [id] => 738
            )
        [2] => WP_Term Object
            (
                [id] => 88
            )
        [3] => WP_Term Object
            (
                [id] => 905
            )
    )
 

Я пытаюсь отсортировать этот массив, поместив id 88 его сверху, но оставив порядок одинаковым для всего остального. Итак, я заканчиваю…

   Array
    (
        [0] => WP_Term Object
            (
                [id] => 88
            )
        [1] => WP_Term Object
            (
                [id] => 455
            )
        [2] => WP_Term Object
            (
                [id] => 738
            )
        [3] => WP_Term Object
            (
                [id] => 905
            )
    )
 

Я думал о том, чтобы сначала перебрать массив и удалить элемент, id 88 а затем повторно вставить его наверх.

Это правильный подход или есть более эффективный способ?

Комментарии:

1. Это нормально sort или ksort нет? (просто обратите внимание, в первом массиве дважды 0 указан ключ, один из них перезаписывается)

2. php.net/manual/en/function.sort.php

3. Если важно упорядочить другие элементы, вы сможете использовать собственные *sort функции только в том случае, если вы используете PHP 8 — они нестабильны до этой версии. Есть еще несколько открытых вопросов о стабильной сортировке, но, по сути, это то, что вы ищете. Для более ранних версий, если все, что вам нужно сделать, это переместить один элемент наверх, то удаление и повторная вставка, вероятно, более понятны.

4. Не думайте об этом как о сортировке; сначала найдите индекс элемента, который вы ищете, сохраните элемент, удалите его из массива, а затем снова снимите его с массива.

5. @fightstarr20 Я написал реализацию здесь: gist.github.com/matslindh/c5006d85e93a7f441331bb9dd35866a0 — замените сравнение на что-то, что вместо этого проверяет id объект.

Ответ №1:

Сначала то, что вы пытаетесь сделать, это не сортировка. Он просто находит элемент с указанным идентификатором, а затем помещает этот элемент в начало массива. Тогда как сортировка — это реорганизация данных в определенном порядке.

Ваш подход правильный, и я думаю, что нет более эффективного способа.