Заставить PHP сохранять индексы массива в том порядке, в котором они были определены?

#php #arrays

#php #массивы

Вопрос:

Я пытаюсь быть умным и возвращаю всю информацию, необходимую для сортировки и отображения друзей пользователя приложения и определяемых пользователем групп, к которым они принадлежат. Важно сначала сохранить их в групповом порядке, а затем в порядке друзей. Пока у меня есть этот запрос, который работает отлично:

 SELECT * FROM friends 
            left join `groups` 
            on `groups`.id = friends.group_id 
            where `friends`.user_id = 1 
            ORDER BY `groups`.priority ASC, friends.priority ASC 
  

Он возвращает информацию точно так, как я ожидал, с нулевыми значениями для информации о группе, где друзья не входят в группу. Для этого у меня есть общая (зарезервированное имя группы) группа «друзья» и отсортируйте ее по нескольким массивам для последующего пользователя следующим образом:

         foreach ($rows as $group_friend) {
            // group id or keyword "friends" if null
            $group_id = ($group_friend['group_id']?:'friends');
            // Do it this way to prevent duplicates AND make it accessible by either index or value
            $user['groups'][$group_id] = $group_id;
            $user['friends'][] = $group_friend['friend_id'];
            $user['group_friends'][$group_id][] = $group_friend['friend_id'];
        }
  

Запрос выполняется на серверной странице php, доступ к которой осуществляется через запрос CURL с передней панели в формате JSON. Когда я загружаю страницу backend.php?get_user=1, я вижу пользовательские данные, но данные группы не в порядке:

 groups  
    23  "23"
    24  "24"
    25  "25"
    friends "friends"
friends 
    0   "8"
    1   "9"
    2   "16"
    3   "2"
    4   "12"
    5   "20"
    6   "97"
    7   "98"
    8   "3"
    9   "4"
    10  "99"
    11  "100"
    12  "129"
    13  "17"
    14  "18"
    15  "165"
group_friends   
    23  
        0   "3"
        1   "4"
        2   "99"
        3   "100"
        4   "129"
    24  
        0   "2"
        1   "12"
        2   "20"
        3   "97"
        4   "98"
    25  
        0   "17"
        1   "18"
        2   "165"
    friends 
        0   "8"
        1   "9"
        2   "16"
  

Порядок в основном сохраняется, но группа 24 имеет более высокий приоритет, чем 23, и должна быть первой. Когда я вывожу результаты запроса, он правильно отображает все 24 групповых данных до 23, но в итоге они переворачиваются в результирующих массивах (оба из них). Что я могу сделать, кроме записи его с числовым индексом вместо принудительного порядка?

Я рассматривал возможность установки индекса для групп в качестве приоритета, но приоритет является необязательным полем и может иметь дубликаты (null).

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

1. Хак: префикс идентификатора группы с group- , чтобы PHP не предполагал его числовой индекс массива; решение: сохраните отдельный массив с правильной последовательностью и повторите его, чтобы получить группы в правильном порядке. порядок.

2. Это как-то связано с тем, как вы отображаете данные (или, возможно, обрабатываете их дальше); PHP сохранит порядок в соответствии с тем, как вы вводили значения в массив, поэтому, если 24 он был введен первым в качестве ключа, он тоже выйдет первым. Смотрите, например: 3v4l.org/2PBCJ

3. 24 определенно на первом месте из-за повторного выполнения запроса, возвращающегося по порядку. Я проверил это, сбросив результаты sql напрямую. Несмотря на это, результирующие массивы не в порядке, когда я сбрасываю их как JSON

4. На данный момент кажется, что использование текстовых клавиш работает. Не кажется, что это должно быть необходимо, но, видимо, есть некоторые махинации на работе.