我试图使用递归来循环遍历多维对象,如果值不是对象则显示键值对,或者如果值是嵌套对象则从内部调用相同的函数。这是我的代码:
<?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个属性的对象可能会产生数千行结果。
答案 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;
}