使用array_filter后json_encode的结果不同

10
我希望json_encode返回像这样的内容
[{key: "value"},{key:"value"},...]

相反我收到这样的东西:
{"1": {key: "value"}, "2": {key: "value"}, ...}

结果一直很好,直到我执行了 array_filter ... 很奇怪...

function somefunction($id, $ignore = array()) {
    $ignorefunc = function($obj) use ($ignore) {
        return !in_array($obj['key'], $ignore);
    };

    global $db;

    $q = "Some query";

    $rows = $db->giveMeSomeRows();
    $result = array();
    if ($rows) {
        // this mapping I've always done
        $result = array_map(array('SomeClass', 'SomeMappingFunction'), $rows);
        if (is_array($ignore) && count($ignore) > 0) {
            /////// PROBLEM AFTER THIS LINE ////////
            $result = array_filter($result, $ignorefunc);
        }
    }
    return $result;
}

再说一遍,如果我注释掉array_filter,从somefunction返回的内容使用json_encode后就能得到我想要的结果,否则我会得到一个JSON对象。
如果在array_filter之前和之后var_dump $result,它们都是PHP数组类型,键中没有字符串等。
1个回答

14
你想要一个数组,但是因为你的数组没有从0开始,所以你得到了JSON对象。尝试使用`array_values`重置数组。
例子:
$arr = array(1=>"a",2=>"Fish");
print(json_encode($arr));
print(json_encode(array_values($arr)));

输出

{"1":"a","2":"Fish"}
["a","Fish"]

替换

 $result = array_filter($result, $ignorefunc);

随着

  $result = array_filter($result, $ignorefunc);
  $result = array_values($result);

感谢@Baba的答案,我遇到了类似的问题,这个解决了它! - ryanpitts1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接