array_map并将 2 个参数传递给映射函数 - array_map():参数 #3 应该是一个数组

2022-08-30 14:44:58

我有一个抽象类,看起来像这样:

abstract class Transformer {

    /**
     * Transform a collection of items
     *
     * @param array $items
     * @param bool $format
     * @return array
     */
    public function transformCollection(array $items, $format)
    {
        return array_map([$this, 'transform'], $items, $format);
    }

    /**
     * Transform a item
     *
     * @param array $item
     * @param bool $format
     * @return mixed
     */
    public abstract function transform(array $item, $format);

}

然后我有以下类来实现它:

class ServiceLogTransformer extends Transformer {

    public function transform(array $service_log, $format = false)
    {
        return [
            'id'    => $service_log['id'],
            'date'  => $service_log['log_date'],
            'time'  => $service_log['log_time'],
            'type'  => ($format ? status_label($service_log['log_type']) : $service_log['log_type']),
            'entry' => $service_log['log_entry']
        ];
    }

}

当此代码运行时,我收到错误:

array_map():参数 #3 应该是一个数组

在类中调用函数时,如何传递 2 个或更多参数?我检查了PHP文档,看起来这是允许的,但它在我的Larave 4.2项目上不起作用。array_map

有什么想法吗?


答案 1

请始终阅读文档:

http://php.net/manual/en/function.array-map.php

array array_map ( callable $callback , array $array1 [, array $... ] )

然而,你把布尔作为论据$format

“当你在类中调用array_map函数时,如何传递2个或更多参数?

我会用语法创建匿名函数use()

public function transformCollection(array $items, $format)
{
    return array_map(function($item) use ($format) {
        return $this->transform($item, $format);
    }, $items);
}

答案 2

不能用于将硬编码值传递给回调函数(函数式语言中通常称为或部分应用的函数)。需要的是可变数量的数组,所有这些数组都应该具有相同数量的元素。每个数组的当前索引处的元素作为单独的参数传递给回调。因此,例如,如果您这样做:array_mapcurryingarray_map

$arr1 = [1, 2, 3, 4];
$arr2 = [2, 4, 6, 8];

$func = function ($a, $b) { return $a.'-'.$b; };


$arr3 = array_map($func, $arr1, $arr2);

你得到这个:

['1-2', '2-4', '3-6', '4-8']

希望这解释了它背后的想法 - 您传入的每个数组都将具有第一个数组中当前位置的元素,作为相关参数传递给回调函数。

因此,正如我所说,它不用于将“静态”值传递给回调。但是,您可以通过动态定义匿名函数来自己执行此操作。在您的方法中:transformCollection

return array_map(function ($item) use ($format) {
    return $this->transform($item, $format);
}, $items);

推荐