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