我有一个PHP脚本从数据库中提取数据,结果集按特定顺序返回,例如
Name: John, Age: 21, Address: 1234 Fifth Ave.
我在调试时验证了订单。然后将结果集推入一个数组,然后将其编码为json对象,并通过AJAX请求传递给我的jquery脚本。
var resultSet = [];
$.ajax({
async: false,
url: 'scripts/getData.php,
dataType: "json",
success: function(data) {
/* Store the pieces of the array */
resultSet = data["php_resultSet"]; //<--Breakpoint here shows the resultSet sorted, if order is preserved here, my problem will be solved.
}
});
但是,当我获取数据并分析数组时,它会被排序,例如
Address: 1234 Fifth Ave., Age: 21, Name: John Age: 21
我想保留原始结果集的顺序,是否有必须设置的选项才能执行此操作?感谢帮助。
更新:
以下是构建数组并对其进行编码的PHP代码片段
$data = array ( "otherData" => array(), "php_resultSet" => array() );
while ( $row = sqlsrv_fetch_array ( $stmt, SQLSRV_FETCH_ASSOC ) ) {
//Push the entire row to the result set array
array_push ( $data["php_resultSet"], $row );
}
asort($someData);
foreach ( $someData as $key) {
array_push ( $data["otherData"], $key );
}
return json_encode($data);//<--At this point, even though the I sorted $someData before pushing it to the $data, the php_resultSet maintains its sorted order.
答案 0 :(得分:2)
猜测你的问题是因为Name: John, Age: 21, Address: 1234 Fifth Ave.
表示一个关联数组,当JSON编码它变成一个对象(http://php.net/manual/en/function.json-encode.php)并且在客户端(没有代码它是在黑暗中拍摄)你使用for in
构造,这里键的顺序是任意的(https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in)。为了保持顺序,您需要在PHP代码中使用非关联数组。
答案 1 :(得分:1)
将哈希(关联数组)编码为JSON时,由于源语言中哈希的表示方式不同,因此无法保证键/值对的顺序。例如,Perl中的哈希以这样的方式存储,以便以字段顺序为代价来优化存储要求。
话虽如此,有几种方法可以让JavaScript重新排序AJAX结果,一种是将结果与预期的呈现顺序一起返回,如:
{
"presentation_order": [
"Name",
"Address",
etc.
],
"records": [
{"Name":"Juan", etc.},
etc.
]
}
然后使用它在填充预期显示的表格之前或之时重新排序记录。
另一种方法可能是为每个记录中的每个字段名称附加一个值,该值可用于在检索后对它们进行排序,然后在显示之前从字段名称中删除排序值。
因此,在将结果转换为JSON后,在服务器上,为第一个字段名称添加“aa_”前缀,将每个后续字段名称的前缀增加到“zz_”。因此,如果前两个字段名称是“Name”和“Address”,则变为“aa_Name”和“ab_Address”。
然后在将记录添加到客户端的表之前,按字段名称对字段进行排序,然后使用fieldName=fieldName.substring(3)
删除前缀。
答案 2 :(得分:0)
从数据库中检索结果后,您可能正在构建数组。我会尝试在服务器端记录JSON字符串本身。我知道你说你在调试过程中“验证了订单”,但是不清楚你是用数据库结果集还是将数组转换成JSON字符串。