删除一些元素后,将顺序数组转换为json

时间:2018-01-31 11:29:58

标签: php arrays json

所以我有一个json字符串和一个像这样的数组:

$json_str = '{"key1":["val11", "val12", "val13"], "key2":"val2"}';
$delete_keys = array("val12");

我想从json_str ['key1']中删除delete_keys中的值。所以我做了以下事情:

$json_arr = json_decode($json_str, true);
$key1 = $json_arr['key1'];
foreach ($delete_keys as $key) {
    $index = array_search($key, $key1);
    if (isset($index))
        unset($key1[$index]);
    unset($index);
}
$json_arr['key1'] = $key1;
$json_str = json_encode($json_arr);
print $json_str;

现在我期望json_str的结果是这个

  

{“key1”:[“val11”,“val13”],“key2”:“val2”}

但我得到了这个

  

{“key1”:{“0”:“val11”,“2”:“val13”},“key2”:“val2”}

如果我删除了最后一个键,它的工作方式正如我预期的那样。有人可以告诉我如何将前者作为json字符串而不是后者。

2 个答案:

答案 0 :(得分:1)

您应该使用array_values()重新索引数组。

如果数组中的键不是连续的,则它是一个关联数组。

答案 1 :(得分:0)

在json_encode的PHP文档中有一个这种现象的例子,标有"顺序数组,其中一个键未设置":http://php.net/manual/en/function.json-encode.php

转载于此:

$sequential = array("foo", "bar", "baz", "blong");
// ...
unset($sequential[1]);
var_dump(
 $sequential,
 json_encode($sequential)
);
// Outputs: string(33) "{"0":"foo","2":"baz","3":"blong"}"

为了使密钥保持顺序,您可以使用array_values重新编号:

$sequential = array("foo", "bar", "baz", "blong");
// ...
unset($sequential[1]);
$sequential = array_values( $sequential );
var_dump(
 $sequential,
 json_encode($sequential)
);
// Outputs: string(21) "["foo","baz","blong"]"