php 如何在array_map的callable [duplicate]中实现类方法

mlmc2os5  于 2023-01-24  发布在  PHP
关注(0)|答案(9)|浏览(123)
    • 此问题在此处已有答案**:

How to use class methods as callbacks(5个答案)
两个月前关门了。
我试图创建一个类来处理数组,但似乎无法让array_map()在其中工作。

$array = [1,2,3,4,5,6,7,8,9,10];
class test {
    public $values;

    public function adding($data) {
        $this->values = array_map($this->dash(), $data);
    }

    public function dash($item) {
        return '-' . $item . '-';
    }

}

var_dump($array);

$test = new test();
$test->adding($array);

// Expected: -1-,-2-,-3-,-4-... 
var_dump($test->values);
    • 此输出**

array(10) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) [6]=> int(7) [7]=> int(8) [8]=> int(9) [9]=> int(10) }

Warning: Missing argument 1 for test::dash(), called in [...]\arraytesting.php on line 11 and defined in [...]\arraytesting.php on line 15

Warning: array_map() expects parameter 1 to be a valid callback, function '--' not found or invalid function name in [...]\arraytesting.php on line 11 NULL

我做错了什么,还是这个函数在类内部不起作用?

huwehgph

huwehgph1#

您以错误的方式将dash指定为回调。
这是行不通的:

$this->classarray = array_map($this->dash(), $data);

这将:

$this->classarray = array_map([$this, 'dash'], $data);

了解回调可能采用的不同形式here

wmvff8tz

wmvff8tz2#

当使用类方法作为array_map()usort()等函数的回调函数时,必须将回调函数作为二值数组发送。第二个值始终是字符串形式的方法名称。第一个值是上下文(类名或对象)

// Static outside of class context
array_map( array( 'ClassName', 'methodName' ), $array );

// Static inside class context
array_map( array( __CLASS__, 'methodName' ), $array );

// Non-static outside of object context
array_map( array( $object, 'methodName' ), $array );

// Non-static inside of object context
array_map( array( $this, 'methodName' ), $array );
1aaf6o9v

1aaf6o9v3#

array_map($this->dash(), $data)使用0个参数调用$this->dash(),并将返回值用作回调函数以应用于数组的每个成员。您需要使用array_map(array($this,'dash'), $data)

xxb16uws

xxb16uws4#

它必须是

$this->classarray = array_map(array($this, 'dash'), $data);

array-thing是对象示例方法的PHP回调函数,对常规函数的回调函数被定义为包含函数名('functionName')的简单字符串,而静态方法调用被定义为array('ClassName, 'methodName')或如下所示的字符串:'ClassName::methodName'(从PHP 5.2.3开始可以使用)。

tkqqtvp1

tkqqtvp15#

array_mapcallback 作为其第一个参数。
对静态方法的回调是这样写的:

array('classname', 'methodname')

这意味着,在您的特定情况下,您将用途:

array_map(array('stripSlashesRecursive', ''), $value);

有关 callbacks 的更多信息,请参见PHP手册的这一节:本文档中使用的伪类型和变量-回调。

o4tp2gmn

o4tp2gmn6#

如果类属于不同的命名空间,你需要使用完整的命名空间类名称。下面是一个使用CakePHP Utility类的例子:
这是行不通的:

array_map(array('Inflector', 'humanize'), $some_array));

这将工作:

array_map(array('Cake\Utility\Inflector', 'humanize'), $some_array));
uxhixvfz

uxhixvfz7#

array_map( array('Sanitize', 'stripSlashesRecursive'), $value) ...
yizd12fk

yizd12fk8#

//常规函数:数组Map('我的函数',$数组);
//类中的静态函数:数组Map(数组('我的类','我的函数'),$数组);
//对象中的函数:数组Map(数组($this,“我的函数”),$数组);
//父类中的函数array_map(array($this,'parent::MyFunction'),$array);

x7rlezfr

x7rlezfr9#

对于多维数组(任何数组):

$data = array_map('decode'), $data);

    function decode($data)
    {
        if (is_array($data)) {
            foreach ($data as &$value) {
                if (is_array($value)) {
                    $value = decode($value);
                } else {
                    $value = html_entity_decode($value);
                }
            }
        } else {
            $data = html_entity_decode($data);
        }
        return $data;
    }

对于类中的多维数组(任何数组):

$data = array_map(array($this,'decode'), $data);

private function decode($data)
{
    if (is_array($data)) {
        foreach ($data as &$value) {
            if (is_array($value)) {
                $value = $this->decode($value);
            } else {
                $value = html_entity_decode($value);
            }
        }
    } else {
        $data = html_entity_decode($data);
    }
    return $data;
}

相关问题