2010-02-25 29 views
1

我想将一个数组传递给函数,并在此函数中遍历它。但我希望能够改变单个条目的显示方式。在函数中处理数组,并使用外部格式

假设我有复杂对象的数组:

$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开始的任何机会?有创意!

+1

你能解释一下究竟是什么问题,谢谢 –

+4

你能解释一下为什么你还在使用PHP4吗? – Gordon

+0

*叹*我的公司使用古老的软件遍布各地...此外,我详细阐述了这个问题。 – blinry

回答

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); 
+0

谢谢你的回答!这解决了我的问题,但创造了很多开销,我宁愿坚持我的foreach循环。我将不得不为每个我想要列表的地方创建不同的回调函数。除此之外,注入函数必须位于不同的文件/类/名称空间中以保持其可重用。我将如何从那里访问我的回调函数? – blinry

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将是一个巨大的胜利在这里,以其匿名函数的支持。

+0

这个解决方案不够灵活,当我想添加一个字段时,它需要很大的改变。 – blinry

+0

添加一个字段在哪里?如果您的要求更广泛,请编辑您的问题以反映此问题。 – outis