cro*_*com 15 javascript php json
我在PHP中有一个多维数组:
Array
(
[1] => Array
(
[19] => Array
(
[type] => 2
)
[6] => Array
(
[type] => 4
)
[12] => Array
(
[type] => 3
)
)
)
Run Code Online (Sandbox Code Playgroud)
当我通过javascript json_encode这个数组:
var jsonArray = <?php echo json_encode($above_array); ?>;
Run Code Online (Sandbox Code Playgroud)
我得到:
Object
(
[1] => Object
(
[6] => Object
(
[type] => 2
)
[12] => Object
(
[type] => 4
)
[19] => Object
(
[type] => 3
)
)
)
Run Code Online (Sandbox Code Playgroud)
我希望保留第一个订单而不是第二个订单.
Ale*_*exM 10
StackOverflow上有一个问题 JavaScript保证对象属性命令吗? 简而言之,答案是否定的,但事实并非如此.因此,在将PHP数组转换为Javascript对象时,不会保留键顺序.
PHP和Javascript中的数组之间的主要区别在于后者只能保存从零开始的顺序整数键.因此,并不总是可以将PHP数组转换为Javascript数组.我们来看几个例子:
// example 1
echo json_encode(array(0 => 'a', 1 => 'b')) // outputs ["a","b"]
// example 2
echo json_encode(array(0 => 'a', 3 => 'b')) // outputs {"0":"a","3":"b"}
// example 3
echo json_encode(array(3 => 'b', 0 => 'a')) // outputs {"3":"b","0":"a"}, but in Javascript the key order will be the same as in example 2
Run Code Online (Sandbox Code Playgroud)
json_encode将PHP数组转换为相同的Javascript数组.json_encode不是保留键顺序的功能,而是Javascript本身.回到我们的问题:如何将PHP数组传递给Javascript,保留密钥顺序?一种方法是将PHP键值对包装到数组中:
// original array:
array(
3 => 'b',
0 => 'a'
)
// must be converted to:
array(
array(3, 'b'),
array(0, 'a')
)
Run Code Online (Sandbox Code Playgroud)
然后json_encode将导致以下Javascript数组:
[
[3,"b"],
[0,"a"]
]
Run Code Online (Sandbox Code Playgroud)
最后一部分是在Javascript中迭代这样一个数组:
var php_encoded_array = [
[3,"b"],
[0,"a"]
];
for (var i=0; i < php_encoded_array.length; i++) {
var rec = php_encoded_array[i],
key = rec[0],
value = rec[1];
console.log(key + ': ' + value);
}
// It will output:
// 3: b
// 0: a
// Which is the exact same order as in the PHP array
Run Code Online (Sandbox Code Playgroud)
此方法也与非整数键兼容.
这是在PHP端转换数组的代码(由类似问题中的pr1001建议).它适用于一维数组.
array_map(
function($key, $value) { return array($key, $value); },
array_keys($data),
array_values($data)
)
Run Code Online (Sandbox Code Playgroud)
这是多维数组的递归函数实现:
function array_preserve_js_order(array $data) {
return array_map(
function($key, $value) {
if (is_array($value)) {
$value = array_preserve_js_order($value);
}
return array($key, $value);
},
array_keys($data),
array_values($data)
);
}
Run Code Online (Sandbox Code Playgroud)
要保留 PHP 数组的顺序,请使用array_values()函数。
<?php $php_array = array_values($php_array); ?>
var jsonArray = JSON.parse('<?php echo json_encode($php_array); ?>');
Run Code Online (Sandbox Code Playgroud)
问题是在JavaScript中只有数组是有序的,对象则不是.
如果你有类似的东西:
array(
array(
'type' => 2
'id' => 6
),
array(
'type' => 4
'id' => 12
),
array(
'type' => 3
'id' => 19
)
)
Run Code Online (Sandbox Code Playgroud)
然后在您的JavaScript中,您将拥有一个对象数组,该数组将保留其顺序.
它出现故障的原因是因为你的数组的索引没有从0开始,键没有按顺序,键中有间隙.因此,在编码时,PHP将其转换为对象而不是数组.
| 归档时间: |
|
| 查看次数: |
10891 次 |
| 最近记录: |