我有一个多维数组,例如:
$values = array(
'one' => array(
'title' => 'Title One',
'uri' => 'http://example.com/one',
),
'two' => array(
'title' => 'Title Two',
'uri' => 'http://example.com/two',
),
);我想用我的implode函数中的一个闭包来解析它,例如:...and:
$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。
发布于 2013-06-26 11:49:58
阿什温的答案是正确的。原因如下:
当您将闭包直接传递给implode方法时-它显式地需要第二个array类型的参数-它实质上是检查instanceof,因此产生了无效参数。implode函数不需要mixed,也不知道执行闭包。
当您第一次将该函数赋给一个变量时,它会导致PHP首先对该变量求值,最后将函数的返回值传递给implode。
在这种情况下,您将从函数中返回一个数组,并将其传递给implode -它会进行校验。
编辑/添加:该匿名函数将为instanceof Closure。
Closure !== array发布于 2013-06-26 11:51:36
使用array_map
$final_string = implode(' | ', array_map(function($item) {
return '<a href="' . $item['uri'] . '">' . $item['title'] . '</a>';
}, $values));我相信您会在实际代码中正确地将这些值转义为HTML。
至于为什么它可以工作而你的代码不能工作,你可以将一个函数作为第二个参数传递给implode。坦率地说,这没有什么意义:您可以将一堆字符串连接在一起,甚至可以将一组函数连接在一起,但您不能将单个函数连接在一起。这听起来很奇怪,特别是如果你这么说的话。
相反,我们首先希望使用一个函数转换数组中的所有项,并将结果传递给implode。此操作通常称为map。幸运的是,PHP以array_map的形式提供了这个函数。在对数组中的项进行转换后,我们可以连接结果。
发布于 2013-06-26 11:43:38
似乎您需要将函数赋给一个变量,然后将其传递以使其正常工作。
$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,并且
Closure !== arrayhttps://stackoverflow.com/questions/17311099
复制相似问题