array_filter将索引数组转换为关联数组

ale*_*nst 4 php arrays projection higher-order-functions

我有一个索引数组,包含一些关联数组,我应用一个简单的

$my_arr = array_filter($my_arr, function($obj) {
    return $obj["value"] < 100;
});
Run Code Online (Sandbox Code Playgroud)

用于过滤数组中的一些项目的函数.

这开始以奇怪的方式使我的Angular前端错误,所以几分钟后我发现$my_arr正在从索引数组转换为关联数组.

  • 这是预期的行为array_filter吗?
  • 我怎么知道array_filter我想要一个索引数组?

编辑:根据评论的要求,我的$my_arr:

$my_arr = [
    ["foo" => "bar", "value" => 10],
    ["foo" => "var", "value" => 30],
    ["foo" => "car", "value" => 440],
    ["foo" => "dar", "value" => 700]
]
Run Code Online (Sandbox Code Playgroud)

编辑:我的代码中的真实世界提取:

$media = [
    "photos" => [
        ["foo" => "bar", "value" => 10],
        ["foo" => "var", "value" => 20],
        ["foo" => "car", "value" => 50],
    ]
];

echo json_encode($media);
echo "\n\n";

$media["photos"] = array_filter($media["photos"], function($photo) {
    return $photo["value"] > 15;
});

echo json_encode($media); 
Run Code Online (Sandbox Code Playgroud)

输出:

{"photos":[{"foo":"bar","value":10},{"foo":"var","value":20},{"foo":"car","value":50}]}

{"photos":{"1":{"foo":"var","value":20},"2":{"foo":"car","value":50}}}
Run Code Online (Sandbox Code Playgroud)

预期产量:

{"photos":[{"foo":"bar","value":10},{"foo":"var","value":20},{"foo":"car","value":50}]}

{"photos":[{"foo":"var","value":20},{"foo":"car","value":50}]}
Run Code Online (Sandbox Code Playgroud)

Ano*_*ous 7

数组没有从一种类型转换为另一种类型 - 它们在PHP中是相同的.这只是array_filter()在过滤时保留键/值关联.根据文档无法自动重新索引数组,因此您必须手动执行:

$my_arr = array_values(array_filter($my_arr, function($obj) {
    return $obj["value"] < 100;
}));
Run Code Online (Sandbox Code Playgroud)

  • @alexandernst 问题是,array_filter 只是过滤掉值,所以剩余的元素保留它们的键并且不会重新索引。如果你`json_encode()`一个数组,它不是基于0的索引,那么它会在输出中添加键。因此,在您的示例中,缺少 0 键,它被解释为关联数组。这就是为什么你必须用 `array_values()` 重新索引你的键,这样 `json_enocde()` 就会看到基于 0 的索引数组并且不包括输出中的键。 (2认同)