【问题标题】:Why doesn't array_filter() mutate my strings while it iterates?为什么 array_filter() 在迭代时不改变我的字符串?
【发布时间】:2018-07-11 18:06:31
【问题描述】:

所以我有以下数组:

array:3 [
  0 => "6.05"
  1 => "5.94"
  2 => "5.96"
]

通过以下函数传递:

$filteredShots = array_filter($shots, function($shot) {
        if (is_numeric($shot)) {
            return floatval($shot);
        }
});

然后吐出完全相同的数组:

array:3 [
  0 => "6.05"
  1 => "5.94"
  2 => "5.96"
]

为什么这些仍然是字符串?我告诉它把它们转换成floatval。难道我做错了什么?我疯了吗?

如果我在 return 语句中死掉并转储,我会得到:6.05,而不是“6.05”,所以......为什么数组会反映这一点?

【问题讨论】:

    标签: php arrays array-filter


    【解决方案1】:

    array_filter 期望回调函数中的truefalse 保留或删除相应的元素。在您的实现中,除非您有 0 或 false 值,否则它将始终返回 true。您想要 array_map 实际应用回调的返回:

    $filteredShots = array_map(function($shot) {
            if (is_numeric($shot)) {
                return floatval($shot);
            }
    }, $shots);
    

    您也可以使用array_walk修改原始数组:

    array_walk($shots, function(&$shot) {
            if (is_numeric($shot)) {
                $shot = floatval($shot);
            }
    });
    

    您可以使用array_filter 删除非数字:

    $filteredShots = array_filter($shots, function($shot) {
            return is_numeric($shot) ? true : false;
    });
    //or simply
    $filteredShots = array_filter($shots, 'is_numeric');
    

    【讨论】:

    • @TheWebs 这就是文档的用途,尽管函数名称似乎很清楚地描述了它们的作用。过滤意味着将集合减少为仅匹配某些条件的项目。
    猜你喜欢
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2017-02-10
    • 2012-03-27
    • 2019-04-12
    • 2019-02-02
    相关资源
    最近更新 更多