【问题标题】:Why won't trim work as a callback for array_walk or array_map in PHP?为什么不能在 PHP 中将 trim 用作 array_walk 或 array_map 的回调?
【发布时间】:2013-02-12 08:55:29
【问题描述】:

为什么我的示例代码导致第一个字符串仍然有尾随空格?

$a=array('test_data_1 ','test_data_2');
array_walk($a, 'trim');
array_map('trim', $a);                    
foreach($a AS $b){
    var_dump($b);
}

字符串(12)“test_data_1”字符串(11)“test_data_2”

【问题讨论】:

    标签: php trim array-map array-walk


    【解决方案1】:

    首先,array_walk 对你的目的来说是错误的函数。

    其次,array_map 不会改变原始数组,而是返回映射后的数组。所以你需要的是:

    $a = array_map('trim', $a);
    

    【讨论】:

    • 谢谢,确实错过了 array_map 返回的内容 - 但是你能具体说明为什么你认为 array_walk 是一个错误的函数吗?
    • 如果您阅读manual,您会看到array_walk 只是调用一个带有数组每个值(和键)的函数。因此它的效果与以下内容相同:trim('test_data_1 ', 0); trim('test_data_2 ', 1) - 没有分配,没有副作用(顺便说一下,修剪的第二个参数错误)。您当然可以为array_walk编写自己的函数,然后修剪实际的数组元素。
    【解决方案2】:

    对于array_walk要修改数组中的项目(值),回调必须是一个函数,它通过引用获取它的第一个参数并修改它(这不是普通trim的情况),所以你的代码会变成:

    $a=array('test_data_1 ','test_data_2');
    array_walk($a, function (&$value) { $value = trim($value); }); // by-reference modification
    // (no array_map)
    foreach($a AS $b){
        var_dump($b);
    }
    

    或者,使用array_map,您必须使用返回值重新分配数组,因此您的代码将变为:

    $a=array('test_data_1 ','test_data_2');
    // (no array_walk)
    $a = array_map('trim', $a); // array reassignment
    foreach($a AS $b){
        var_dump($b);
    }
    

    【讨论】:

      【解决方案3】:

      array_map 返回一个新数组,试试这个

      $a=array('test_data_1 ','test_data_2');
      array_walk($a, 'trim');
      $a = array_map('trim', $a);
      foreach($a AS $b){
          var_dump($b);
      }
      

      【讨论】:

        猜你喜欢
        • 2012-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-14
        • 1970-01-01
        • 1970-01-01
        • 2011-03-26
        • 2019-12-18
        相关资源
        最近更新 更多