0

我有一个可能看起来像这样的数组:

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"
  }
]
4

2 回答 2

2

尝试使用这个:

$test = array(
  0 => array(
    0=> "baz"
  ),
  1 => array(
    4=> "bar"
  )
);

$json = json_encode($test, JSON_FORCE_OBJECT);

var_dump($json);

自 PHP 5.3.0 起可用。

于 2013-09-15T07:36:20.147 回答
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,在文档中没有看到该选项,teo如果您使用的是 PHP 5.3.0+,请使用 's answer

于 2013-09-15T07:18:00.180 回答