【问题标题】:array map + class method/function as callback + call_user_func数组映射 + 类方法/函数作为回调 + call_user_func
【发布时间】:2012-09-10 10:50:35
【问题描述】:

我不知道我在下面的代码中做错了什么,但它不起作用。

if($_data_count = count($_csv_raw_array) > 0){
            foreach($_csv_raw_array as $_csv_row){
                array_push($this->_data, array_map(call_user_func(array($this, 'replace')), $_csv_row));
            }
            return $this->result(true, 'CSV parsing done.', '', $this->_data);
        }

// 而替换函数是:

    private function replace($_value){
    return preg_match('/(\r\n|\n|\r)/', $_value) ? '' : $_value;
}

但我不知道为什么它不起作用并抛出异常:

遇到了 PHP 错误

严重性:警告

消息:Import::replace() 缺少参数 1

文件名:libraries/Import.php

行号:116

基本上我想要在这里导入一个我已经导入的 CSV 文件,现在我想将数组中存在的任何换行符替换为空(无)。但是每次我执行这段代码时,它都会抛出一个异常。你们那里的人可以建议吗?请。

感谢

【问题讨论】:

  • 您应该完全删除call_user_func,因为这会导致该函数被立即调用;改为使用:array_map(array($this, "replace"), $_csv_row)
  • @Mahn,错了,replace 被调用时没有参数。
  • @dbf 因为参数通常会由 array_map 传递,如果不是因为 call_user_func 会立即调用该函数,从 OPs 代码的外观来看,这不是他打算做的.你可以做array_map("functionThatExpectsArgument", $array),但你不能做:array_map(call_user_func("functionThatExpectsArgument"), $array)
  • array_map 的第一个参数是可调用的,您肯定会收到错误,因为在您的示例中它将有一个数组。
  • @dbf 不,这是在不使用闭包的情况下指向可调用对象属性的标准方式,传递 array($this, "replace") 只会指向 $this->replace() 并验证作为可调用的参数。见:php.net/manual/en/language.types.callable.php

标签: php arrays class map array-map


【解决方案1】:

正如 cmets 中所指出的,根据您的代码判断,您将希望删除该 call_user_func,因为这会导致该函数被立即调用并且这似乎不是您想要的,我认为这是在每次迭代中过滤掉 $_csv_row 中的所有元素:

if($_data_count = count($_csv_raw_array) > 0){
    foreach($_csv_raw_array as $_csv_row){
        array_push($this->_data, array_map(array($this, 'replace'), $_csv_row));
    }
    return $this->result(true, 'CSV parsing done.', '', $this->_data);
}

不过,我们只能猜测您的意图,您可能需要提供一个示例 csv 和所需的输出,以便如果这不能解决问题,我们可以更准确地了解您在寻找什么。

【讨论】:

    猜你喜欢
    • 2016-03-28
    • 1970-01-01
    • 2011-06-13
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    相关资源
    最近更新 更多