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

7
我有一个索引数组,其中包含几个关联数组,并且我应用了一个简单的
$my_arr = array_filter($my_arr, function($obj) {
    return $obj["value"] < 100;
});

用于筛选数组某些项的函数。

这开始使我的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]
]

编辑:我的代码中的现实世界示例:

$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); 

输出:

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

{"photos":{"1":{"foo":"var","value":20},"2":{"foo":"car","value":50}}}

预期输出:

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

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

请展示您的数组结构。 - Rizier123
@Rizier123 完成了,请检查编辑。 - alexandernst
现在它是如何转换为关联数组的?请同时展示您的当前输出和期望输出。 - Rizier123
@Rizier123 好的,请检查我的第二次编辑。 - alexandernst
2
array_values()调用包装在array_filter()周围,你就可以开始了。 - Rizier123
1个回答

12

在PHP中,数组并没有从一种类型转换为另一种类型 - 它们是相同的东西。只是当进行过滤时,array_filter() 会保留键/值关联。根据文档,没有自动重新索引数组的方式,所以您必须手动完成:

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

虽然这个方法可行,但感觉非常不优雅(而且糟糕,并不是因为解决方案,而是因为PHP如何处理我的数据)。这就是PHP处理数组与对象的方式吗? - alexandernst
2
@alexandernst 问题在于,array_filter只是过滤值,因此剩余的元素保留其键而不被重新索引。如果您json_encode()一个非基于0的索引数组,则它将在输出中添加键。因此,在您的示例中,键0丢失并被解释为关联数组。这就是为什么您必须使用array_values()重新索引您的键,以便json_enocde()看到基于0的索引数组,并且不在输出中包含键。 - Rizier123
@alexandernst 不,他们为什么要这样做?像往常一样:$array = ["normalKey" => "value"]; - Rizier123
@Rizier123 当我说“对象”时,我指的是Javascript中“对象”数据类型。 - alexandernst
@alexandernst,PHP 不是静态类型语言。而且,在技术上说,所有的 PHP 数组都是关联数组。例如,C 中的真正数组存储在相邻的内存中,但在 PHP 中不是这样的。祝你愉快。 - Raphael Rafatpanah
显示剩余5条评论

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