我想将一个数组传递给一个函数并在这个函数中迭代它。但我希望能够改变单个条目的显示方式。
假设我有一系列复杂的对象:
$items = array($one, $two, $three);
现在我做:
$entries = array();
foreach($items as $item) {
$entries[] = create_li($item["title"], pretty_print($item["date"]));
}
$list = wrap_in_ul($entries);
我想在一行中完成上述操作:
$list = create_ul($items, $item["title"], pretty_print($item["date"]));
从PHP4开始,有没有机会这样做?要有创意!
答案 0 :(得分:2)
您可以使用回调:
function item_title($item) {
return $item['title'];
}
function item_date($item) {
return $item['date'];
}
function prettyprint_item_date($item) {
return pretty_print($item['date']);
}
function create_ul($items, $contentf='item_date', $titlef='item_title') {
$entries = array();
foreach($items as $item) {
$title = call_user_func($titlef, $item);
$content = call_user_func($contentf, $item);
$entries[] = create_li($title, $content);
}
return wrap_in_ul($entries);
}
...
$list = create_ul($items, 'prettyprint_item_date');
PHP 5.3将是一个很大的胜利,它支持匿名函数。
答案 1 :(得分:2)
根据我的理解,您正在寻找带有功能参数的“注入”类型迭代器。在php中,注入迭代器是array_reduce,不幸的是它已经坏了,所以你必须编写自己的,例如
function array_inject($ary, $func, $acc) {
foreach($ary as $item)
$acc = $func($acc, $item);
return $acc;
}
定义一个回调函数,处理每个项目并返回累加器值:
function boldify($list, $item) {
return $list .= "<strong>$item</strong>";
}
其余的很容易:
$items = array('foo', 'bar', 'baz');
$res = array_inject($items, 'boldify', '');
print_r($res);