我正在构建一个查询数据库的IOS应用程序。我不断地得到结果,并且在应用程序的某些功能中,如评论,我必须按顺序完成它们。显然JSON正在返回一个字典,但我需要对结果进行排序。这是服务器端代码:
function sendResponse($status = 200, $body = '', $content_type = 'text/html') {
$status_header = 'HTTP/1.1 ' . $status . ' ' . getStatusCodeMessage($status);
header($status_header);
header('Content-type: ' . $content_type);
echo $body;
}
$result = array();
$i = 0;
$sqlGetComments = mysqli_query($link, "SELECT * FROM photo_comments WHERE photo_id='$photoID' ORDER BY post_date DESC");
while ($row = mysqli_fetch_array($sqlGetComments)) {
$result[$i] = array(
'photoID' => $row['photo_id'],
'userID' => $row['userID'],
'username' => $row['username'],
'comment' => $row['comment'],
'postedDate' => $row['post_date'],
);
$i++;
} // end while
sendResponse(200, json_encode($result));
我有解析它的IOS代码,但是我需要它的顺序错误。所以必须有一些我可以做服务器端的事情。
更新,这是客户端代码:
[request setCompletionBlock:^{
NSString *responseString = [request responseString];
[self updateComments:responseString];
}];
- (void)updateComments:(NSString *)update {
NSDictionary *root = [update JSONValue];
NSEnumerator *enumerator = [root keyEnumerator];
id key;
while (key = [enumerator nextObject]) {
NSDictionary *value = [root objectForKey:key];
_photoID = [value objectForKey:@"photoID"];
NSString *photoID = [value objectForKey:@"photoID"];
NSString *userID = [value objectForKey:@"userID"];
NSString *username = [value objectForKey:@"username"];
NSString *comment = [value objectForKey:@"comment"];
NSString *postedDate = [value objectForKey:@"postedDate"];
NSString *cellString = [NSString stringWithFormat:@"%@ \n %@ \n %@", username, comment, postedDate];
[_queryResultsMessage addObject:cellString];
}
[_tableView reloadData];
}
这是打印输出,请记住注释字段中的“Test”字符串是JSON字符串应该如何打印出来的:
{"1":{"photoID":"1","userID":"17","username":"kismet","comment":"Test 6","postedDate":"7 hrs ago"},"2":{"photoID":"1","userID":"17","username":"kismet","comment":"Test 5","postedDate":"8 hrs ago"},"3":{"photoID":"1","userID":"17","username":"kismet","comment":"Test 4","postedDate":"8 hrs ago"},"4":{"photoID":"1","userID":"17","username":"kismet","comment":"Test 3","postedDate":"8 hrs ago"},"5":{"photoID":"1","userID":"17","username":"kismet","comment":"Test 2","postedDate":"8 hrs ago"},"6":{"photoID":"1","userID":"17","username":"kismet","comment":"Test 1","postedDate":"8 hrs ago"}}
它打印出来好但是我猜它在被分配到NSDictionary时变得混乱。如果没有人有任何答案,我会尝试通过将其分配给NSArray来调整它,看看我是否能以某种方式解析它。
答案 0 :(得分:1)
需要一点客户端IOS hackery
对于那些仍然对解决方案感兴趣的人:
NSDictionary *userData = [update JSONValue];
NSArray *keys = [[userData allKeys] sortedArrayUsingSelector:@selector(compare:)];
NSMutableArray *array = [NSMutableArray arrayWithCapacity: [keys count]];
int i = 0;
for (NSString *key in keys) {
[array addObject: [userData objectForKey: key]];
i++;
}
for (NSDictionary *myDict in array) {
NSString *comment = [myDict objectForKey:@"comment"];
NSLog(@"USERCOMMENT %@", comment);
}
按顺序返回JSON:
USERCOMMENT Test 6
USERCOMMENT Test 5
USERCOMMENT Test 4
USERCOMMENT Test 3
USERCOMMENT Test 2
USERCOMMENT Test 1
答案 1 :(得分:0)
值得注意的是 - 您正在请求从MySQL订购的商品 - Ergo,PHP正在按顺序生成JSON。
因此,我只是建议在PHP中编辑循环...
while ($row = mysqli_fetch_array($sqlGetComments)) {
$result[$i] = array(
'photoID' => $row['photo_id'],
'userID' => $row['userID'],
'username' => $row['username'],
'comment' => $row['comment'],
'postedDate' => $row['postedDate'],
'orderBy' => $i
);
$i++;
} // end while
......并在Obj-C中通过“orderBy”组织它们。
注意,我所做的就是为JSON项添加一个额外的变量 - “orderBy”;因为MySQL的结果将按照正确的顺序排列,因此按正确的顺序进行解析,这个“orderBy”变量就像一个键。
自从我使用iOS SDK以来已经有一段时间了 - 但我很确定它们将是一种对NSMutableArray进行排序的方法;如果不是 - 一个简单的循环可以工作;使用x的密钥请求每个对象,而x <1。 NSMutableArray的长度。然而,我会查找“正确”的做法,因为这会让我感到烦恼!
我建议调查结果出现故障背后的真正原因!这应该不会发生!我在iOS中没有做过类似的事情,但我认为在请求JSON时这不是正确的行为。
故障排除步骤可能是在浏览器中或在桌面环境中检查返回的JSON并确保PHP正确返回它,然后查看它是如何返回到应用程序的 - 确保所有数据都存在以及是否存在模式秩序失真。
编辑:我注意到你说它正在返回一系列字典。我的坏。 我找到了another question that goes into sorting an array of dictionaries。
答案 2 :(得分:0)
在您的MySql查询中,您要对post_date
进行排序,但在将其添加到结果数组时请参考postedDate
。两者都存在吗?
如果post_date
实际上不存在,那么您的数据库查询不会按预期排序......