Обработка массива в функции с внешним форматированием - PullRequest
1 голос
/ 25 февраля 2010

Я хочу передать массив функции и перебрать его в этой функции. Но я хотел бы иметь возможность изменить способ отображения отдельных записей.

Предположим, у меня есть массив сложных объектов:

$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? Будьте креативны!

Ответы [ 2 ]

2 голосов
/ 25 февраля 2010

насколько я понимаю, вы ищете итератор типа "инъекция" с функциональным параметром. В 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);
2 голосов
/ 25 февраля 2010

Вы можете использовать обратные вызовы:

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 был бы большой победой здесь с его поддержкой анонимных функций.

...