Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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
PHP/json编码错误地解释为关联数组_Php_Arrays_Json - Fatal编程技术网

PHP/json编码错误地解释为关联数组

PHP/json编码错误地解释为关联数组,php,arrays,json,Php,Arrays,Json,Edit1:问题:我想在php中将关联数组转换为索引数组。因此,我可以通过json_编码将其作为数组而不是对象返回。为此,我试图填补丢失的钥匙。以下是描述: 遇到一个小问题,我需要将json_编码的数组作为数组传输到js。此时它返回一个对象。我正在使用Angular,所以我真的需要一个数组。我尽可能多地解释它 $arrNew[0][5][0][0][1]["id"] = 1; //$arrNew[0][0][0][0][1] = ""; //$arrNew[0][1][0][0][1] = ""

Edit1:问题:我想在php中将关联数组转换为索引数组。因此,我可以通过json_编码将其作为数组而不是对象返回。为此,我试图填补丢失的钥匙。以下是描述:

遇到一个小问题,我需要将json_编码的数组作为数组传输到js。此时它返回一个对象。我正在使用Angular,所以我真的需要一个数组。我尽可能多地解释它

$arrNew[0][5][0][0][1]["id"] = 1;
//$arrNew[0][0][0][0][1] = "";
//$arrNew[0][1][0][0][1] = "";
//$arrNew[0][2][0][0][1] = "";
//$arrNew[0][3][0][0][1] = "";
//$arrNew[0][4][0][0][1] = "";
$arrNew[0][5][0][0][1]["name"] = 'Test';
var_dump($arrNew);

因此,如果我现在返回它,它将第二个元素作为缺少索引0-4的对象原因返回,第四个元素作为缺少索引0的原因返回(关联数组->对象)

因此,如果我取消对块的注释,它就像一个符咒。现在我遇到了一个问题,不是每次元素5、3、4或其他什么时候都有,所以我构建了一个自动添加它们的函数:

$objSorted = cleanArray($arrNew);
function cleanArray($array){
    end($array);
    $max = key($array) + 1; //Get the final key as max!
    for($i = 0; $i < $max; $i++) {
        if(!isset($array[$i])) {
            $array[$i] = '';
        } else {
            end($array[$i]);
            $max2 = key($array[$i]) + 1;
            for($i2 = 0; $i2 < $max2; $i2++) {
            .... same code repeats here for every index
$objSorted=cleanArray($arrNew);
函数cleanArray($array){
结束($阵列);
$max=key($array)+1;//将最后一个密钥获取为max!
对于($i=0;$i<$max;$i++){
if(!isset($array[$i])){
$array[$i]='';
}否则{
结束($array[$i]);
$max2=键($array[$i])+1;
对于($i2=0;$i2<$max2;$i2++){
..这里对每个索引重复相同的代码
因此,如果我将其转储,它将返回:

问题: 在js方面,它仍然是一个对象,我还看到元素没有排序。因此我认为PHP仍然将其视为一个关联数组。有什么线索可以解释为什么会发生这种情况吗?键与循环的索引一起设置,并且必须是一个整数值


PS:我知道在JS中重写它是可能的,但是几乎每个请求都会有大量循环

如果我理解你的问题,你会创建一个稀疏的多维对象数组。因为数组在键中有间隙,会在某些级别上生成对象,但你需要它来生成除最内部级别之外的所有级别的数组l

以下函数在所有数组级别上填充缺少的键(从
0
开始,直到数组中用作数字键的最大值)。然后,它按键对每个数组进行排序,以确保
json\u encode()
将其编码为数组而不是对象

需要进行排序,否则
json_encode()
将生成一个对象;此行为将在文档页面的a中解释:

编码数组时,如果键不是从0开始的连续数字序列,则所有键都将编码为字符串,并为每个键值对显式指定

输出:

============= Before ==============
[{"5":[[{"1":{"id":1,"name":"Test"}}]],"3":[{"2":{"1":{"id":2}}}]}]
============= After ==============
[[null,null,null,[[null,null,[null,{"id":2}]]],null,[[[null,{"id":1,"name":"Test"}]]]]]
$arr=$arr+array_fill(0,$max,NULL);
使用
NULL
作为缺少的键的值。我认为,这对于解析数组的Javascript代码来说是最好的(您可以使用
if(!arr[0])
来检测伪值)

您可以使用空字符串(
'
)而不是
NULL
来获取较短的JSON:

[["","","",[["","",["",{"id":2}]]],"",[[["",{"id":1,"name":"Test"}]]]]]

但是它需要JS端稍长的代码来检测伪值(
if(arr[0]!='')
).

我不清楚…你需要密钥
5
吗?那么它就不能被编码为数组。或者你是在问如何去掉密钥
5
,这样它就可以被编码为数组?你希望得到什么样的JSON数据呢?@deceze我需要密钥5,然后通过JSON_encode将其作为数组返回。所以我尝试用零值填充缺少的密钥好的,这更有意义。也许想澄清一下这个问题。你想在JS中得到数组而不是对象吗?如果有人能解释为什么这一个被否决了这么多,那就好了,我的意思是我发布了一个明确的例子。输出和我的预期。不确定我在这里做错了什么。首先,如果你读到我的问题是,我已经有了一个填补空白的函数。问题是它仍然将其解释为关联数组,并以js中的对象的方式进行解释。现在,即使在ksort之前,键也已正确排序。有趣的是,如果我添加了ksort,它不会改变任何东西,它确实将其从关联数组转换为数值数组,这比在JS中工作。我不知道为什么,但实际上是ty。我永远不会尝试对已排序的数组进行排序:D Ah和NULL提示我也会使用。我看到你已经有了一个函数来填补空白,我只是不喜欢;-)我的函数可以在任意级别上工作。在
ksort()
之前,键是:5、0、1、2、3、4(你可以在你在问题中发布的
var_dump()
中看到它们)。它们不是,并且
json_encode()
生成一个对象来保持解码顺序。在
ksort()之后
它们是:0、1、2、3、4、5,在编码时可以安全地忽略它们。将其编码为数组会在解码时产生相同的结果。我重新构建了它,在填充漏洞后添加了0、1、2、3、4、5,所以它仍然不想工作,但ksort()修复了它。无论如何,它将重建到您的填充算法中。喜欢它的人也比我的多:)
[["","","",[["","",["",{"id":2}]]],"",[[["",{"id":1,"name":"Test"}]]]]]