递归PHP函数循环遍历多维对象

时间:2015-07-07 13:27:28

标签: php recursion

我试图使用递归来循环遍历多维对象,如果值不是对象则显示键值对,或者如果值是嵌套对象则从内部调用相同的函数。这是我的代码:

<?php
function display_fields($data,$html='')
{
    foreach($data as $key => $value)
    {
        if (is_object($value)) $html .= display_fields($value,$html);
        else $html .= '
            <div class="row">
                <div class="col-xs-3">'.$key.'</div>
                <div class="col-xs-9">'.$value.'</div>
            </div>';
    }
    return $html;
}

然后,最初会调用此函数传递整个对象。

我意识到可能有更好的方法来做到这一点,但我特别想了解递归,并希望有机会找出我在这里做错了什么。

编辑: 我忘了提到,我得到的不良后果是,相同的数据会重复很多次。因此,具有20个属性的对象可能会产生数千行结果。

2 个答案:

答案 0 :(得分:5)

据我了解你的问题,你只需要调用函数而不用返回结果的$html参数:

function display_fields($data, &$html='') // added pass by reference
{
    foreach($data as $key => $value)
    {
        if (is_object($value)) 
            display_fields($value,$html); // no need to concat
        else $html .= '
            <div class="row">
                <div class="col-xs-3">'.$key.'</div>
                <div class="col-xs-9">'.$value.'</div>
            </div>';
    }
    return $html;
}

答案 1 :(得分:3)

这是一个不使用pass-by-ref并且有少量参数验证的版本。

function display_fields($data)
{
    $html = '';

    if(is_object($data) || is_array($data)) {
        foreach($data as $key => $value)
        {
            if (is_object($value) || is_array($data)) { 
                $html .= display_fields($value);
            } else {
                $html .= '<div class="row">
                    <div class="col-xs-3">' . $key . '</div>
                    <div class="col-xs-9">' . $value . '</div>
                </div>';
            }
        }
    } else {
        throw new InvalidArgumentException('An object or array was expected.');
    }

    return $html;
}

另一个追踪完整关键路径的“有趣”变体

function display_fields($data, $path = '')
{
    $html = '';

    if(is_object($data) || is_array($data)) {
        foreach($data as $key => $value)
        {
            if (is_object($value) || is_array($data)) { 
                $html .= display_fields($value, $path . $key . '.');
            } else {
                $html .= '<div class="row">
                    <div class="col-xs-3">' . $path . $key . '</div>
                    <div class="col-xs-9">' . $value . '</div>
                </div>';
            }
        }
    } else {
        throw new InvalidArgumentException('An object or array was expected.');
    }

    return $html;
}