强制PHP保持数组索引的定义顺序?
我试着聪明一点,返回我需要的所有信息,以排序和显示应用程序用户的朋友以及他们所属的用户定义组。重要的是要先让他们保持团体秩序,然后再让朋友秩序。到目前为止,我有一个非常有效的查询:强制PHP保持数组索引的定义顺序?,php,arrays,Php,Arrays,我试着聪明一点,返回我需要的所有信息,以排序和显示应用程序用户的朋友以及他们所属的用户定义组。重要的是要先让他们保持团体秩序,然后再让朋友秩序。到目前为止,我有一个非常有效的查询: SELECT * FROM friends left join `groups` on `groups`.id = friends.group_id where `friends`.user_id = 1 ORDE
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
它返回的信息与我预期的完全一样,对于好友不在组中的组信息,为空。为此,我有一个catchall(保留组名)“friends”组,并将其排序为几个数组,以供以后的用户使用,如下所示:
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页面上运行,该页面通过来自前端的JSON格式的CURL请求访问。当我加载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组,因此应该排在第一位。当我输出查询结果时,它正确地显示了23之前的所有24个组数据,但它最终在结果数组中翻转(两个)。除了写一个数字索引来强制排序,我还能做什么
我考虑将组的索引设置为优先级,但优先级是可选字段,可以有重复项(null)。黑客:在组id前面加上
组-
,这样PHP就不会假定它是数字数组索引;解决方案是:使用正确的序列保留一个单独的数组,并在该数组上迭代以获得正确顺序的组;PHP将根据您在数组中输入值的方式保留排序,因此如果将24
作为键放在第一位,那么它也将首先出现。请参阅示例:24肯定在第一位,因为查询结果按顺序返回。我通过直接转储sql结果来验证它。尽管现在我将其作为JSON转储时结果数组出现了问题,但使用文本键似乎确实有效。似乎没有必要,但显然有一些恶作剧在起作用。黑客:在组id前面加上group-
,这样PHP就不会假设它是一个数字数组索引;解决方案是:使用正确的序列保留一个单独的数组,并在该数组上迭代以获得正确顺序的组;PHP将根据您在数组中输入值的方式保留排序,因此如果将24
作为键放在第一位,那么它也将首先出现。请参阅示例:24肯定在第一位,因为查询结果按顺序返回。我通过直接转储sql结果来验证它。尽管现在我将其作为JSON转储时结果数组出现了问题,但使用文本键似乎确实有效。似乎没有必要,但显然有一些恶作剧在起作用。