同时循环通过数组

时间:2015-01-07 15:40:57

标签: php arrays loops infinite-loop globals

创建循环遍历块的块构建器按顺序拉出表单数据库。

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;
        }
    }

函数has_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循环,因为函数has_block将为当前块id设置一个全局变量。然后,这将在名为the_element的函数中使用。如:

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

如果我不使用函数has_block来设置它,那么我需要将foreach循环中的块id作为第二个参数传递给每个元素。

1 个答案:

答案 0 :(得分:0)

我修正了这个,因为@Jim,注意到我在loop_blocks()中重新设置了loop_position,这就是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;

请注意,我在不正确的地方有感叹号。 这现在可以完美地满足我的需要。