我的函数是以舒适的方式显示数组结构

My function to display array structure in a comfortable way

提问人:Eugene 提问时间:7/12/2023 最后编辑:greybeardEugene 更新时间:7/13/2023 访问量:64

问:

我编写了自己的函数来以一种舒适的方式显示数组结构。
它显示这样的数组:

$data:
$data[id] = 3

$config:
$config[last_offer_day] = 01.07.2023
and etc.

我觉得我的代码太麻烦了。

function darr ($var, $name = '')
{
    if($name) $out = '<b>'.$name.':</b><br>';
    $len = 250;

    foreach($var as $key1=>$val1)
    {
        $key1 = $name ? '['.$key1.']' : '$'.$key1;

        if(is_array($val1) || is_object($val1))
        {
            if(count($val1) > 1) $out .= '<br>'.$key1.':<br>';

            foreach($val1 as $key2=>$val2)
            {
                if(is_array($val2) || is_object($val2))
                {
                    foreach($val2 as $key3=>$val3)
                    {
                        if(is_array($val3) || is_object($val3))
                        {
                            foreach($val3 as $key4=>$val4)
                            {
                                if(is_array($val4) || is_object($val4))
                                {
                                    foreach($val4 as $key5=>$val5)
                                    {
                                        if(is_array($val5) || is_object($val5))
                                        {
                                            foreach($val5 as $key6=>$val6)
                                            {
                                                if(is_array($val6) || is_object($val6))
                                                {
                                                    foreach($val6 as $key7=>$val7)
                                                    {
                                                        $out .= $name.$key1.'['.$key2.']['.$key3.']['.$key4.']['.$key5.']['.$key6.']['.$key7.'] = '.trim((mb_strlen($val7) > $len ? mb_substr($val7, 0, $len).'...' : $val7),' \n').'<br>';
                                                    }
                                                } else $out .= $name.$key1.'['.$key2.']['.$key3.']['.$key4.']['.$key5.']['.$key6.'] = '.trim((mb_strlen($val6) > $len ? mb_substr($val6, 0, $len).'...' : $val6),' \n').'<br>';
                                            }
                                        } else $out .= $name.$key1.'['.$key2.']['.$key3.']['.$key4.']['.$key5.'] = '.trim((mb_strlen($val5) > $len ? mb_substr($val5, 0, $len).'...' : $val5),' \n').'<br>';
                                    }
                                } else $out .= $name.$key1.'['.$key2.']['.$key3.']['.$key4.'] = '.trim((mb_strlen($val4) > $len ? mb_substr($val4, 0, $len).'...' : $val4),' \n').'<br>';
                            }
                        } else $out .= $name.$key1.'['.$key2.']['.$key3.'] = '.trim((mb_strlen($val3) > $len ? mb_substr($val3, 0, $len).'...' : $val3),' \n').'<br>';
                    }
                } else $out .= $name.$key1.'['.$key2.'] = '.trim((mb_strlen($val2) > $len ? mb_substr($val2, 0, $len).'...' : $val2),' \n').'<br>';
            }
        } else $out .= $name.$key1.' = '.trim((mb_strlen($val1) > $len ? mb_substr($val1, 0, $len).'...' : $val1),' \n').'<br>';
    }

    return $out;
}

有没有办法让我的代码更小、更简单?

PHP 数组 调试

评论

1赞 Professor Abronsius 7/12/2023
这似乎更适合 CodeReview
0赞 GrumpyCrouton 7/12/2023
这似乎没有必要,只需使用类似 .这将以可读的格式打印整个阵列。<pre><?= print_r($array, true) ?></pre>
0赞 pacmaninbw 7/12/2023
@ProfessorAbronsius True,只要代码确实有效。

答:

0赞 James 7/12/2023 #1

这使用递归调用来处理嵌套数组或对象。您不需要多个嵌套循环,并且它还可以正确处理方括号中数字键的显示。

function darr($var, $name = '')
{
    $out = '';
    $len = 250;

    if ($name) {
        $out .= '<b>' . $name . ':</b><br>';
    }

    if (is_array($var) || is_object($var)) {
        foreach ($var as $key => $val) {
            $keyString = is_numeric($key) ? '[' . $key . ']' : "['" . $key . "']";
            $displayName = $name . $keyString;

            if (is_array($val) || is_object($val)) {
                if (count($val) > 1) {
                    $out .= '<br>' . darr($val, $displayName);
                } else {
                    $out .= darr($val, $displayName);
                }
            } else {
                $out .= $displayName . ' = ' . trim((mb_strlen($val) > $len ? mb_substr($val, 0, $len) . '...' : $val), " \n") . '<br>';
            }
        }
    }

    return $out;
}
-1赞 Eugene 7/12/2023 #2

谢谢你,詹姆斯。 它很好,但问题不大。如果是对象,我得到错误:行中不可计数:

if (count($val) > 1) {

这是我的小修复:

function darr($var, $name = '')
{
    $out = '';
    $len = 250;

    if ($name) 
    {
        $out .= '<b>' . $name . ':</b><br>';
    }

    if (is_array($var) || is_object($var)) 
    {
        foreach ($var as $key => $val) 
        {
            $keyString = is_numeric($key) ? '[' . $key . ']' : "['" . $key . "']";
            $displayName = $name . $keyString;

            if (is_array($val) || is_object($val)) 
            {
                if (is_array($val) && count($val) > 1) $out .= '<br>';
                $out .= darr($val, $displayName);
            } else {
                $out .= $displayName . ' = ' . trim((mb_strlen($val) > $len ? mb_substr($val, 0, $len) . '...' : $val), " \n") . '<br>';
            }
        }
    }

    return $out;
}

评论

0赞 Eugene 7/12/2023
对于对象需要,我使用如下: count(get_object_vars($val)); ?
0赞 Amolgorithm 7/17/2023
您可能需要更加注意语法,因为这可能会影响其他人如何看待您的问题质量