#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/2PBCJ3. 24 определенно на первом месте из-за повторного выполнения запроса, возвращающегося по порядку. Я проверил это, сбросив результаты sql напрямую. Несмотря на это, результирующие массивы не в порядке, когда я сбрасываю их как JSON
4. На данный момент кажется, что использование текстовых клавиш работает. Не кажется, что это должно быть необходимо, но, видимо, есть некоторые махинации на работе.