我有一个数组,可能看起来像这样:
array(
1 => "foo",
4 => "bar"
)
当我json_encode
它时,结果是这样的:
{
"1": "foo",
"4": "bar"
}
这正是我需要的。
但是,数组可能如下所示:
array(
0 => "baz"
)
在这种情况下,我希望 JSON 最终如下所示:
{
"0": "baz"
}
但相反,它的结局是这样的:
[
"baz"
]
有什么方法可以强制 JSON 编码器假设这是一个对象而不是数组?
编辑:抱歉,我在这篇文章中简化了它,但现在我意识到它非常重要:这个数组嵌套在另一个数组中,该数组必须是一个数组,而不是一个对象。
编辑2:示例:
array(
0 => array(
0: "baz"
),
1 => array(
4: "bar"
)
)
需要成为:
[
{
0: "baz"
},
{
4: "bar"
}
]
尝试使用这个:
$test = array(
0 => array(
0=> "baz"
),
1 => array(
4=> "bar"
)
);
$json = json_encode($test, JSON_FORCE_OBJECT);
var_dump($json);
从 PHP 5.3.0 开始可用。
首先将其
强制转换为对象:
<?php
$array = array(
0 => "baz"
);
echo json_encode((object)$array);
?>
输出:
{"0":"baz"}
编辑:
<?php
$array = array(
0 => array(
0=> "baz"
),
1 => array(
4=> "bar"
)
);
$array = castOnConsecutiveRecursive($array);
echo json_encode($array);
//json_encode acts as you want unless the array is consecutive from 0, so if that's the case then we have to cast it
function isConsecutive($array){
$lastIndex = null;
foreach($array as $key=>$value){
if(is_null($lastIndex)){
$lastIndex = $key;
if($key !== 0)
return false;
continue;
}
if($lastIndex !== $key+1)
return false;
}
return true;
}
function castOnConsecutiveRecursive($array){
foreach($array as $key => $value){
if(is_array($value)){
$array[$key] = castOnConsecutiveRecursive($value);
if(isConsecutive($value))
$array[$key] = (object)$value;
}
}
return $array;
}
?>
编辑2:Doh,在文档中没有看到该选项,如果您使用的是 PHP 5.3.0+,请使用 teo
的答案