在implode()中使用回调

jte*_*rry 11 php closures

我有一个多维数组,例如:

$values = array(
    'one' => array(
        'title' => 'Title One',
        'uri'   => 'http://example.com/one',
    ),
    'two' => array(
        'title' => 'Title Two',
        'uri'   => 'http://example.com/two',
    ),
);
Run Code Online (Sandbox Code Playgroud)

...我想通过我的implode函数中的闭包来解析它,àla:

$final_string = implode(' | ', function($values) {
    $return = array();

    foreach($values as $value)
        $return[] = '<a href="' . $value['uri'] . '">' . $value['title'] . '</a>';

    return $return;
});
Run Code Online (Sandbox Code Playgroud)

但是,这种用法会产生Invalid arguments passed错误.我是否缺少哪种语法可以使闭包的使用成为可能?我正在使用PHP v5.3.16.

ick*_*fay 19

用途array_map:

$final_string = implode(' | ', array_map(function($item) {
    return '<a href="' . $item['uri'] . '">' . $item['title'] . '</a>';
}, $values));
Run Code Online (Sandbox Code Playgroud)

我相信你会在你的真实代码中正确地将这些值作为HTML转义.


至于为什么这样做而你的代码没有,你将一个函数作为第二个参数传递给implode.坦率地说,这没有多大意义:你可以将一堆字符串连接在一起,或者甚至可以连接一堆函数,但是你不能将一个函数连接在一起.这听起来很奇怪,特别是如果你这样说的话.

相反,我们首先要使用的功能转换所有的项目在数组和结果通过进入implode.这种操作最常被称为map.幸运的是,PHP提供了这个功能array_map.在我们转换了数组中的项目之后,我们可以加入结果.


Ach*_*ome 5

看来你需要将函数赋值给一个变量,然后通过它来让它工作。

$fn = function($values) {
    $return = array();
    foreach($values as $value)
        $return[] = '<a href="' . $value['uri'] . '">' . $value['title'] . '</a>';
    return $return;
};
$final_string(' | ', $fn($values));
echo $final_string;
Run Code Online (Sandbox Code Playgroud)

不过,我不确定原因是什么,需要更深入地检查一下才能给你一个适当的理由。

你可以看到代码在这里工作

编辑:将此答案转换为社区维基,以便每个人都可以在这里做出贡献。

编辑:@kmfk 的解释

当您将闭包直接传递给implode方法时——该方法明确需要 type 的第二个参数array,它本质上检查instanceof——因此无效参数。该implode函数不期望mixed类型并且不知道执行闭包以获取array.

当您第一次将该函数分配给一个变量时,它会导致 PHP 首先评估该变量,并最终将函数的返回值传递到implode.

在这种情况下,您将从函数返回一个数组并将其传递给implode- 检出。

该匿名函数将是instanceof Closure,并且

Closure !== array
Run Code Online (Sandbox Code Playgroud)


kmf*_*mfk 2

阿什温的回答是正确的。 原因如下:

当您将闭包直接传递给implode方法时 - 该方法明确需要类型为 的第二个参数array,它实际上会检查instanceof- 因此参数无效。该implode函数不期望mixed也不知道执行闭包。

当您第一次将该函数分配给一个变量时,它会导致 PHP 首先评估该变量,并最终将函数的返回值传递到implode.

在这种情况下,您将从函数返回一个数组并将其传递给implode- 进行检查。

编辑/添加:匿名函数将是instanceof Closure

Closure !== array
Run Code Online (Sandbox Code Playgroud)