保持关联PHP数组的顺序,同时通过ajax将其传递给javascript

时间:2016-08-25 01:55:56

标签: javascript php jquery arrays ajax

所以这是我的php文件代码

GetUserArray.php

$Users = array('7'=>'samei', '4'=>"chaya", '10'=>'abetterchutia');
echo json_encode($Users);

这是我的ajax请求

 $.ajax({
             url: './GetUserArray.php',
             type: 'POST',
             dataType: "json",
             success: function(users) {
                 console.log(users);
                 $.each( users, function( key, value ) {
                 console.log(key, value);
               });
             }

         });

现在它给我的是在控制台中是一个按照该数组的键排序的对象,而我想在我的php文件中使用7 4 10的orignal命令

Object {4: "chaya", 7: "samei", 10: "abetterchutia"}
4 chutiya
7 sali
10 abetterchutia

1 个答案:

答案 0 :(得分:8)

使用散列图的问题在于它们实际上并未指定顺序。虽然,在PHP中,数组实际上是一个有序的hashmap,但它确实如此。将其转换为Javascript中的对象后,将不再保留该订单。保证Javascript顺序的唯一方法是使用数组。

因此在PHP中,这可以按预期工作并保留顺序。

$arr = [4 => "I'm first", 1 => "I'm second", 3 => "I'm third"];

foreach($arr as $value) {
    echo $value, "\n";
}

这给了我们

I'm first
I'm second
I'm third

但是将其编码为Javascript Object Notation(即JSON)并且你得到一个对象,因为在Javascript数组中没有键,它们有索引。

echo json_encode($arr);

给我们......

{"4":"I'm first","1":"I'm second","3":"I'm third"}

如果您尝试在Javascript中使用此对象执行相同的操作,则可能无法获得相同的订单

var obj = {"4":"I'm first","1":"I'm second","3":"I'm third"};

var s = "";
for(var x in obj) {
    s += + obj[x] + "\n";
}

document.write("<pre>" + s + "</pre>");

这可能会给你一些更像......

I'm second
I'm third
I'm first

所以解决这个问题的唯一方法就是使用数组......

json_encode(array_values($arr));

现在这给了我们......

["I'm first","I'm second","I'm third"]

订单维持。

但是,如果您还想保留密钥,则必须创建一个对象数组。

$json = [];
foreach($arr as $key => $value) {
    $json[] = [$key => $value];
}

echo json_encode($json);

现在你得到......

[{"4":"I'm first"},{"1":"I'm second"},{"3":"I'm third"}]

在javascript中,按预期完美运行...

for(var x in obj) {
    for(var n in obj[x]) {
        obj[x][n]; // now you can both maintain order and have access to the key
    }
}