2010-02-25 25 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