Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript json_编码不保留顺序_Javascript_Php_Json - Fatal编程技术网

Javascript json_编码不保留顺序

Javascript json_编码不保留顺序,javascript,php,json,Javascript,Php,Json,我有一个多维数组,用PHP编写: Array ( [1] => Array ( [19] => Array ( [type] => 2 ) [6] => Array ( [type] =>

我有一个多维数组,用PHP编写:

Array
(
[1] => Array
    (
        [19] => Array
            (                    
                [type] => 2
            )            
        [6] => Array
            (                    
                [type] => 4
            )
        [12] => Array
            (                    
                [type] => 3
            )
    )

)
当我通过以下方式在javascript中对该数组进行json_编码时:

 var jsonArray = <?php echo json_encode($above_array); ?>;

我想保留第一个顺序,而不是id的第二个顺序。

问题是在JavaScript中,只有数组是有序的,而对象不是有序的

如果你有这样的事情:

array(
    array(
        'type' => 2
        'id' => 6
    ),
    array(
        'type' => 4
        'id' => 12
    ),
    array(
        'type' => 3
        'id' => 19
    )
)
然后在JavaScript中有一个对象数组,该数组将保持其顺序


它不符合顺序的原因是数组的索引不是从0开始的,键不符合顺序,并且键之间存在间隙。因此,当编码时,PHP将其转换为对象而不是数组。

关于StackOverflow有一个问题 简言之,答案是否定的。因此,在将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
  • 在第一个示例中,
    json\u encode
    将PHP数组转换为相同的Javascript数组
  • 在第二个示例中,它转换为对象,因为键顺序不是连续的
  • 在第三个示例中,它还转换为对象。但在Javascript中,对象2和3将是相同的,具有相同的键顺序,即使键以不同的顺序列出。所以不是
    json_encode
    函数没有保留键顺序,而是Javascript本身
  • 回到我们的问题:如何将PHP数组传递给Javascript以保持键顺序? 一种方法是将PHP键值对包装到数组中:

    // original array:
    array(
        3 => 'b', 
        0 => 'a'
    )
    
    // must be converted to:
    array(
        array(3, 'b'),
        array(0, 'a')
    )
    
    然后
    json\u encode
    将生成以下Javascript数组:

    [
      [3,"b"],
      [0,"a"]
    ]
    
    最后一部分是在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
    
    下面是多维数组的递归函数实现:

    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)
        );
    }
    

    要保留PHP数组的顺序,请使用
    array\u values()
    函数

    <?php $php_array = array_values($php_array); ?>
    var jsonArray = JSON.parse('<?php echo json_encode($php_array); ?>');
    
    
    var jsonArray=JSON.parse(“”);
    
    我如何保持第一顺序?使用其他东西作为键(例如键1、键2、键3),这样您可以在解码jsonJSON后进行排序。JSON对象是无序的键值映射。数组是有序列表。随便你选,Javascript/JSON没有有序映射。如果你想保持有序,你需要的是数组,而不是对象。您需要生成一个如下所示的结构:
    [[19,{type:2}],[9,{type:2}],[6,{type:4}],[12,{type:3}]
    也就是说,一个数组数组,其中每个嵌套数组包含两个元素,“index”和
    type
    对象!
    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)
        );
    }
    
    <?php $php_array = array_values($php_array); ?>
    var jsonArray = JSON.parse('<?php echo json_encode($php_array); ?>');