【问题标题】:array_filter converting an indexed array to an associative arrayarray_filter 将索引数组转换为关联数组
【发布时间】:2015-07-25 11:08:02
【问题描述】:

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

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

用于过滤数组中某些项目的函数。

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

  • 这是array_filter 中的预期行为吗?
  • 如何告诉array_filter 我想要一个索引数组?

编辑:根据 cmets 的要求,我的$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 好的,检查我的第二次编辑。
  • 在您的array_filter() 周围拨打array_values() 电话,一切顺利。

标签: php arrays projection higher-order-functions


【解决方案1】:

数组没有从一种类型转换为另一种类型——它们在 PHP 中是一样的。只是array_filter() 在过滤时保留了键/值关联。没有办法自动重新索引数组according to the documentation,所以必须手动进行:

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

【讨论】:

  • 虽然这可行,但感觉非常麻烦(而且很垃圾,不是因为解决方案,而是因为 PHP 如何威胁我的数据)。这真的是(糟糕)PHP 处理数组与对象的方式吗?
  • @alexandernst 问题是,array_filter 只是将值过滤掉,因此其余元素保留它们的键并且不会重新索引。如果你 json_encode() 一个数组,它不是基于 0 的索引,那么它将在输出中添加键。因此,在您的示例中,缺少键 0 并将其解释为关联数组。这就是为什么您必须使用 array_values() 重新索引您的键,以便 json_enocde() 看到基于 0 的索引数组并且不包括输出中的键。
  • @Rizier123 好的,最后一个问题。你知道未来的 PHP 版本(可能是 7 吗?)是否允许我用每个拥有的语法来实际声明关联/索引数组?类似$a = []; (indexed array)$b = {}; (associative array)
  • @alexandernst 不,他们为什么要这样做?一如既往:$array = ["normalKey" =&gt; "value"];
  • @Rizier123 因为数组和对象(php 称为关联数组)是完全不同的东西,如果我们实际上可以用“正确的”数据类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 2011-09-06
  • 2017-07-27
相关资源
最近更新 更多