在数组内重复指示:重复输出该元素

时间:2016-07-14 19:46:07

标签: php loops foreach nested

我有这个数组(见下文),我想重复每个具有键“重复”的数组,其值表示重复的次数。

$fields = array(
    array(
        'type'  => 'title-wrap',
        'holder' => 'h4',
        'heading'   => 'Test heading',
    ),
    array(
        'repeat' => 3,
        'type'  => 'radio',
        'name'  => 'specific_name',
        'value' => array(
            0 => 'First', // value for first repeat
            1 => 'Second', // value for second repeat
            2 => 'Third' // value for third repeat
        ),
    )
);

为此,我创建了一个名为generateForm的递归函数:

function generateForm($fields, $index = 0) {
    if ( $fields == '' ) { return false; }
    foreach ($fields as $field) {
        if ( isset($field['type']) ) {
            switch ( $field['type'] ) {
            case 'title-wrap':
                echo $field['heading'];
                break;
            case 'radio':
                echo $field['value'][$index];
                break;
            }
        }
        if ( isset($field['repeat']) ) {
            for ($i=0; $i < $field['repeat']-1; $i++) { 
                generateForm($field, $i);
            }
        }
    }
}

我想要的输出:

  

测试标题
     首先
     第二
     第三

但是我没有在输出中得到最后两个单词。我做错了什么?

1 个答案:

答案 0 :(得分:1)

如果你想坚持使用递归方法,那么你需要纠正一些问题:

  • 您的递归调用不会传递数组,而是传递数组的元素。然而该函数需要一个数组。所以你应该在传递第一个参数时将它包装在数组构造中:[$field]
  • 修复上述内容后,当您进行递归调用时,重复键上的测试将再次成功,因此您将再次启动该循环,并进入无限递归。为了防止这种情况发生,请不要循环,但如果还有至少一个重复,则只需递归调用该函数以进行下一次重复。

以下是更正后的代码:

function generateForm($fields, $index = 0) {
    if ( $fields == '' ) { return false; }
    foreach ($fields as $field) {
        if ( isset($field['type']) ) {
            switch ( $field['type'] ) {
            case 'title-wrap':
                echo $field['heading'] . "\n";
                break;
            case 'radio':
                echo $field['value'][$index] . "\n";
                break;
            }
        }
        if ( isset($field['repeat']) && $index < $field['repeat'] - 1) {
            generateForm([$field], $index + 1);
        }
    }   
}