【问题标题】:Passing object method to array_map()将对象方法传递给 array_map()
【发布时间】:2010-12-28 14:03:30
【问题描述】:
    class theClass{
         function doSomeWork($var){
            return ($var + 2);
         }

         public $func = "doSomeWork";

         function theFunc($min, $max){
            return (array_map(WHAT_TO_WRITE_HERE, range($min, $max)));
         }
    }

$theClass = new theClass;
print_r(call_user_func_array(array($theClass, "theFunc"), array(1, 5)));
exit;

谁能告诉我在 WHAT_TO_WRITE_HERE 可以写什么,以便 doSomeWork 函数作为第一个参数传递给 array_map。并且代码可以正常工作。

并给出作为

Array
(
    [0] => 3
    [1] => 4
    [2] => 5
    [3] => 6
    [4] => 7
)

【问题讨论】:

  • 如果你只是在那里写了函数名称,它应该可以工作,“doSomeWork”
  • array($this, $this->func) 将起作用,当传递一个对象时,您需要传入一个数组,其中第一个 arg 是对象,第二个是该对象中的方法 array([object[],function])

标签: php arrays


【解决方案1】:

要通过array_map() 使用对象方法,请传递一个包含对象和对象方法名称的数组。对于同一对象范围,请照常使用$this。由于您的方法名称是在您的public $func 属性中定义的,因此您可以传递func

作为旁注,array_map() 之外的括号不是必需的。

return array_map( [$this, 'func'], range($min, $max));

【讨论】:

  • 刚刚遇到这个问题,但没有奏效。我所要做的就是在没有 $this 的情况下通过它。即 array_map(array($this, 'func')。不知道为什么它不能以第一种方式工作。在这里找到它:stackoverflow.com/questions/5422242/…
【解决方案2】:

以下代码提供了来自 $users 数组的电子邮件数组,其中包含具有 getEmail 方法的类的实例:

    if(count($users) < 1) {
        return $users; // empty array
    }
    return array_map(array($users[0], "getEmail"), $users);

【讨论】:

    【解决方案3】:

    我尝试搜索解决方案,但它不起作用,所以我创建了自定义小地图函数,该函数将为传递给函数的 1 个变量执行任务,它很简单,但会像地图一样工作

    class StyleService {
      function check_css_block($str){
        $check_end = substr($str,-1) == ';';
        $check_sprator =  preg_match_all("/:/i", $str) == 1;
        $check_sprator1 =  preg_match_all("/;/i", $str) == 1;
        if ( $check_end && $check_sprator && $check_sprator1){
          return $str;
        } else {
          return false;
        }
      }
    
      function mymap($function_name, $data){
        $result = array();
        $current_methods = get_class_methods($this);
        if (!in_array($function_name, $current_methods)){
          return False;
        }
        for ($i=0; $i<count($data); $i++){
          $function_result = $this->{$function_name}($data[$i]);
          array_push($result, $function_result);
        }
        return $result;
      }
    
    
      function get_advanced_style_data($data)
    
      {
        return $this->mymap('check_css_block', $data);
      }
    }
    

    这样你就可以在php中调用函数名作为字符串$this-&gt;{'function_name'}()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2011-09-27
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 2019-03-22
      相关资源
      最近更新 更多