【问题标题】:php serialize empty associative arrayphp序列化空关联数组
【发布时间】:2014-01-19 07:24:29
【问题描述】:
我想将关联数组转储到 php.ini 文件中。有时结果可能为空,在这种情况下,我希望文件的内容完全是:{},以便我可以以相同的方式处理所有文件。但是我只能在 php 中初始化一个简单的数组,所以文件中的输出总是这样:[]。我已经尝试向关联数组添加一个虚拟条目,然后再次删除该条目以使数组为空,但随后 [ ] 再次成为文件中的输出。
【问题讨论】:
标签:
php
arrays
json
associative-array
empty-list
【解决方案1】:
在编码之前将其转换为对象:
json_encode((object) $array);
【解决方案2】:
你必须检查数组是否为空。
if (empty($array_to_dump)) {
print ':{}';
} else {
print serialize($array_to_dump);
}
但是,当您反序列化时返回的数组应该完全相同...一个空数组。
编辑:或者使用上面的,甚至更好。
【解决方案3】:
json_encode 函数有一个选项可以将数组强制转换为适合上下文的对象 - ie 关联数组,但这也包括空数组,例如:
$array = array(
'foo' => array(),
'bar' => array()
);
echo json_encode($array, JSON_FORCE_OBJECT); // {"foo":{},"bar":{}}
【解决方案4】:
对此的另一个答案是在初始化变量时使用ArrayObject 而不是[]。
下面说明了这个问题。关联数组为空时,JSON编码为'[]':
$object = [];
echo json_encode($object); // you get '[]'
$object['hello'] = 'world';
echo json_encode($object); // you get '{hello: "world"}'
相反,保持一切不变,但在声明 $object 时,请使用 ArrayObject:
$object = new ArrayObject;
echo json_encode($object); // you get '{}'
$object['hello'] = 'world';
echo json_encode($object); // you get '{hello: "world"}'
这是一个不错的选择的原因是因为使用(object) [] 会将变量转换为stdClass,这意味着您必须使用$variable->property 访问属性。但是,如果您现有的所有代码都是使用$variable['property'] 编写的,那么使用(object) [] 意味着您将不得不更改所有代码,而您可以只使用new ArrayObject。
链接到ArrayObject,自 PHP5 起就可用