Dış biçimlendirme ile bir fonksiyonu bir dizi, Süreç

2 Cevap php

Bir işlevin bir dizi geçmek ve bu işlevi bunun üzerinden yineleme yapmak istiyorum. Ama ben tek kayıtlar görüntülenir biçimini değiştirmek mümkün olmak istiyorum.

Ben karmaşık nesneleri bir dizi var varsayalım:

$items = array($one, $two, $three);

Sağ şimdi yapın:

$entries = array();
foreach($items as $item) {
    $entries[] = create_li($item["title"], pretty_print($item["date"]));
}
$list = wrap_in_ul($entries);

Ben tek satırda yukarıdaki yapmak istiyorum:

$list = create_ul($items, $item["title"], pretty_print($item["date"]));

PHP4 olarak bunu yaparken herhangi bir şans? Yaratıcı olun!

2 Cevap

benim anlayış, işlevsel bir parametre ile bir "enjekte" tipi yineleyici arıyoruz. Php, ne yazık ki kırık, yineleyici array_reduce olduğunu enjekte, böylece kendi yazmak zorunda, örneğin

function array_inject($ary, $func, $acc) {
 foreach($ary as $item)
  $acc = $func($acc, $item);
 return $acc;
}

Her maddeyi işler ve akümülatör değerini döndüren bir geri çağırma işlevi tanımlayın:

function boldify($list, $item) {
 return $list .= "<strong>$item</strong>";
}

gerisi kolay:

$items = array('foo', 'bar', 'baz');
$res = array_inject($items, 'boldify', '');
print_r($res);

Sen geri aramaları kullanabilirsiniz:

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 Anonim işlevler için verdiği destek ile, burada büyük bir kazan olacaktır.