В PHP, как рекурсивно выполнить замыкание, если имя переменной, содержащей анонимную функцию, является переменной-перемеPhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 В PHP, как рекурсивно выполнить замыкание, если имя переменной, содержащей анонимную функцию, является переменной-переме

Сообщение Anonymous »

У меня есть список из примерно 100 статей, и в каждой статье есть список пунктов. Предложения представляют собой список разной глубины.

Код: Выделить всё

$clauses = array(
[
'Fields' => ['Clause' => 'clause 1', 'Status' => 'Draft']
],
[
'Fields' => ['Clause' => 'clause 2', 'Status' => 'Draft'],
'SubClauses' => [
[
'Fields' => ['Clause' => 'clause 2_a', 'Status' => 'Draft'],
'SubClauses' => [
[
'Fields' => ['Clause' => 'clause 2_a_1', 'Status' => 'Draft']
],
[
'Fields' => ['Clause' => 'clause 2_a_2', 'Status' => 'Draft']
]
]
]
]
],
[
'Fields' => ['Clause' => 'clause 3', 'Status' => 'Draft']
]
);

echo PHP_EOL;
Чтобы создать упорядоченный список HTML из массива $clauses, я создал следующее:

Код: Выделить всё

function htmlList ( $clauses, $depth = 0 ) {

if ( $depth == 0 ) {
echo '[list]';
} elseif ( $depth == 1 ) {
echo '';
} else {
echo '';
}

foreach ( $clauses as $key => $clause ) {
if ( isset($clauses[$key]['SubClauses']) ) {
echo '  [*]' . $clauses[$key]['Fields']['Clause'];
htmlList ( $clauses[$key]['SubClauses'], ++$depth );
} elseif ( isset($clauses[$key]['Fields']) ) {
echo '  ' . $clauses[$key]['Fields']['Clause'] . '';
}
}

$depth--;
echo '  ';
echo '[/list]';
}

htmlList ( $clauses );

echo PHP_EOL;
Он создает список только для одной статьи. Когда код переходит к следующей статье, я получаю сообщение об ошибке, поскольку функция уже определена.
Я хочу сохранить HTML-код в шаблоне, а не помещать его в файлы кода, поэтому У меня есть функция в шаблоне, куда она может записать html.
Мне нужно изменить имя функции при цикле следующей статьи, поэтому я преобразовал это в замыкание и присвоил его переменной. Я передаю функцию, так как мне нужно, чтобы она выполнялась рекурсивно.

Код: Выделить всё

$htmlList = function ( $clauses, $depth = 0 ) use ( &$htmlList ) {

if ( $depth == 0 ) {
echo '[list]';
} elseif ( $depth == 1 ) {
echo '';
} else {
echo '';
}

foreach ( $clauses as $key => $clause ) {
if ( isset($clauses[$key]['SubClauses']) ) {
echo '  [*]' . $clauses[$key]['Fields']['Clause'];
$htmlList ( $clauses[$key]['SubClauses'], ++$depth );
} elseif ( isset($clauses[$key]['Fields']) ) {
echo '  ' . $clauses[$key]['Fields']['Clause'] . '';
}
}

$depth--;
echo '  ';
echo '[/list]';
};

$htmlList ( $clauses );

echo PHP_EOL;
Это также работает для одной статьи, но позволяет динамически изменять имя. Затем я сделал имя переменной, содержащей имя функции, динамическим.

Код: Выделить всё

$articles = array(
['Title' => 'title 1', 'Status' => 'Draft'],
['Title' => 'title 2', 'Status' => 'Draft'],
);

for ( $i = 0; $i < sizeof($articles); $i++ ) {

echo $articles[$i]['Title'] . PHP_EOL;

$htmlList = 'htmlList' . '_' . $i;
$$htmlList = function ( $clauses, $depth = 0 ) use ( &$$htmlList ) {

if ( $depth == 0 ) {
echo '[list]';
} elseif ( $depth == 1 ) {
echo '';
} else {
echo '';
}

foreach ( $clauses as $key => $clause ) {
if ( isset($clauses[$key]['SubClauses']) ) {
echo '  [*]' . $clauses[$key]['Fields']['Clause'];
$$htmlList ( $clauses[$key]['SubClauses'], ++$depth );
} elseif ( isset($clauses[$key]['Fields']) ) {
echo '  ' . $clauses[$key]['Fields']['Clause'] . '';
}
}

$depth--;
echo '  ';
echo '[/list]';
};

$$htmlList ( $clauses );

}
Здесь все ломается. Ему не нравится имя функции с переменным именем внутри use(), и он ошибается в $$, потому что это переменная-переменная, и она допускает только 1 $, а у меня есть 2 $$, поскольку значение имени переменной меняется.Было бы лучше сохранить функцию в основном коде вне шаблона, чтобы ее не приходилось создавать заново для каждой статьи, или лучше поместить функцию в шаблон и исключить html из основные файлы кода? Все остальные конструкции, окружающие HTML, обычно находятся в файлах шаблонов.
Как я могу преобразовать предложения в список HTML для каждой просматриваемой статьи?

Подробнее здесь: https://stackoverflow.com/questions/790 ... g-the-anon
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»