初始PHP ARRAY将属性存储为值和相应的ID在密钥上
Array
(
[979] => Pict Model
[962] => Brand
[494] => Dimensions
[980] => Capacity
[981] => Power
[982] => List Price
[983] => Warrenty
[975] => USB Connection
[976] => Self Cleaning
[977] => Double Glass Door
[978] => Steam Function
[974] => Electricity Type
)
在下面的代码中, comparative_attr 包含json编码数组。 之后,因为我 console.log(comparative_attr)这给了我一个从php数组开始的json顺序。
然后,在我解析JSON然后再调试console.log之后,它给了我不同顺序的数据。
var comparable_attr = '<?php echo json_encode($_comparable_attributes); ?>';
if(comparable_attr.length != 0){ //check for empty json
console.log(comparable_attr);
var obj = jQuery.parseJSON(comparable_attr);
console.log(obj);
}
问题:我希望在我解析JSON之后以相同的顺序实现它。
获得的结果:
First Console.log(equivalent_attr)给出:
{"979":"Pict Model","962":"Brand","494":"Dimensions","980":"Capacity","981":"Power","982":"List Price","983":"Warrenty","975":"USB Connection","976":"Self Cleaning","977":"Double Glass Door","978":"Steam Function","974":"Electricity Type"}
第二个Console.log(obj)给出:
Object { 494="Dimensions", 962="Brand", 974="Electricity Type", more...}
已修改:
我发现的是,它根据我的属性id缩短,我需要的顺序与数组中的顺序相同。
答案 0 :(得分:3)
当您将PHP备用数组转换为JSON并随后转换为JS变量时,您将获得JS Object
,而不是数组,并且JS对象显式为无序键集价值对。
如果您希望保留订单,则需要首先在PHP端重新排列数据,可能是:
Array(
Array([979] => Pict Model),
Array([962] => Brand),
...
)
但请注意,如果执行此操作,您将无法通过键直接查找数据,因为生成的JS对象如下所示:
[
{ "979": "Pict Model" }, // NB: all JS keys are strings
{ "962": "Brand" },
...
]
另一种方法可能是按原样发送现有数组,但也可以发送第二个数组,它只是有序的键列表。前者可用于基于密钥的查找,后者可用于确定正确的顺序:
json_encode(array(
'data' => $_comparable_attributes,
'order' => array_keys($_comparable_attributes)
));
答案 1 :(得分:0)
Javascript的json对象顺序依赖于inplementation。您可以在console
:
a = {2:'a', 1:'b'}
Object {1: "b", 2: "a"}
要解决您的问题,我建议您通过以下方式阻止自动排序:
array_reduce(
$a,
function($carry, $item) use(&$a) {
$carry[] = [key($a), $item]; next($a); return $carry;
},
[]
)
这会将您的初始数组包装到包含[key, val]
项的数组中。
希望这有帮助。