В то время как цикл через массив

Создание компоновщика блоков, который проходит по блокам по порядку.

if( loop_blocks()) {
while( loop_blocks()) {
if( have_block('standard-content-block')) {
echo 'standard-content-block';
}

elseif( have_block('executive-intro-block')) {
echo 'executive intro block';
}
}
}

Моя функция loop_blocks извлекает блоки из базы данных по порядку и устанавливает массив как глобальную переменную:

function loop_blocks() {
global $db;

$page_id = get_page_id();
$GLOBALS['loop_position'] = 0;
$loop_position = $GLOBALS['loop_position'];

$stm = $db->prepare("SELECT * FROM page_blocks WHERE page_id = :id ORDER BY `block_order` ASC");
$stm->execute(array(':id' => $page_id));
$res = $stm->fetchAll();
$GLOBALS['block_loop'] = $res;
if(!$res) {
return false;
} elseif(!$GLOBALS['block_loop'][$loop_position]) {
return false;
} else {
return true;
}
}

Функция have_block получает текущую позицию цикла и определяет, существует ли имя в массиве и увеличивает позицию цикла:

function have_block($block_name) {
$loop_position = $GLOBALS['loop_position'];

if(!$GLOBALS['block_loop'][$loop_position]) {
return false;
} elseif(!$GLOBALS['block_loop'][$loop_position][block_name] = $block_name) {
return false;
} else {
$GLOBALS['loop_position'] = $loop_position+1;
return true;
}
}

Однако это возвращает бесконечный цикл, и я не могу найти способ переместить цикл while на следующий шаг?

РЕДАКТИРОВАТЬ Я использую цикл while, потому что функция have_block установит глобальную переменную для текущего идентификатора блока. Это будет затем использоваться в функции под названием the_element. Такие как:

if( loop_blocks()) {
while( loop_blocks()) {
if( have_block('standard-content-block')) {
the_element('heading');
}
}
}

Если я не использую функцию have_block, чтобы установить это, мне нужно передать идентификатор блока из цикла foreach в каждый элемент в качестве второго аргумента.

1

Решение

Я исправил это, поскольку @Jim отметил, что я переустанавливал loop_position в loop_blocks (), поэтому цикл while повторялся бесконечно. Это был простой случай ошибки при наборе текста:

} elseif(!$GLOBALS['block_loop'][$loop_position][block_name] = $block_name) {
return false;

Должно было:

} elseif($GLOBALS['block_loop'][$loop_position][block_name] != $block_name) {
return false;

Обратите внимание, что у меня был восклицательный знак в неправильном месте.
Теперь это работает отлично, как мне нужно.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]