首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在implode()中使用回调

在implode()中使用回调
EN

Stack Overflow用户
提问于 2013-06-26 11:35:05
回答 5查看 8.3K关注 0票数 12

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

代码语言:javascript
复制
$values = array(
    'one' => array(
        'title' => 'Title One',
        'uri'   => 'http://example.com/one',
    ),
    'two' => array(
        'title' => 'Title Two',
        'uri'   => 'http://example.com/two',
    ),
);

我想用我的implode函数中的一个闭包来解析它,例如:...and:

代码语言:javascript
复制
$final_string = implode(' | ', function($values) {
    $return = array();

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

    return $return;
});

但是,这种用法会产生Invalid arguments passed错误。有没有我遗漏的语法可以使这种closures的使用成为可能?我使用的是PHPV5.3.16。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-06-26 11:49:58

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

当您将闭包直接传递给implode方法时-它显式地需要第二个array类型的参数-它实质上是检查instanceof,因此产生了无效参数。implode函数不需要mixed,也不知道执行闭包。

当您第一次将该函数赋给一个变量时,它会导致PHP首先对该变量求值,最后将函数的返回值传递给implode

在这种情况下,您将从函数中返回一个数组,并将其传递给implode -它会进行校验。

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

代码语言:javascript
复制
Closure !== array
票数 2
EN

Stack Overflow用户

发布于 2013-06-26 11:51:36

使用array_map

代码语言:javascript
复制
$final_string = implode(' | ', array_map(function($item) {
    return '<a href="' . $item['uri'] . '">' . $item['title'] . '</a>';
}, $values));

我相信您会在实际代码中正确地将这些值转义为HTML。

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

相反,我们首先希望使用一个函数转换数组中的所有项,并将结果传递给implode。此操作通常称为map。幸运的是,PHP以array_map的形式提供了这个函数。在对数组中的项进行转换后,我们可以连接结果。

票数 26
EN

Stack Overflow用户

发布于 2013-06-26 11:43:38

似乎您需要将函数赋给一个变量,然后将其传递以使其正常工作。

代码语言:javascript
复制
$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;

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

您可以看到运行here的代码

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

编辑:由@kmfk解释

当您将闭包直接传递给implode方法时-它显式地需要第二个array类型的参数-它实质上是检查instanceof,因此产生了无效参数。implode函数不需要mixed类型,也不知道执行闭包来获取array

当您第一次将该函数赋给一个变量时,它会导致PHP首先对该变量求值,最后将函数的返回值传递给implode

在这种情况下,您将从函数中返回一个数组,并将其传递给implode -它会进行校验。

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

代码语言:javascript
复制
Closure !== array
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17311099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档