这个是discuz的安装程序的一段代码,有一点没弄明白,$ks[$level] = $ks[$level - 1]."['$key']";这里的$level - 1应该是-1啊,为什么断点输出的时候是0;求解释function buildarray($array, $level = 0, $pre = '$_config') {
static $ks;
if($level == 0) {
$ks = array();
$return = '';
} foreach ($array as $key => $val) {
if($level == 0) {
$newline = str_pad('  CONFIG '.strtoupper($key).'  ', 70, '-', STR_PAD_BOTH);
$return .= "\r\n// $newline //\r\n";
if($key == 'admincp') {
$newline = str_pad(' Founders: $_config[\'admincp\'][\'founder\'] = \'1,2,3\'; ', 70, '-', STR_PAD_BOTH);
$return .= "// $newline //\r\n";
}
}

$ks[$level] = $ks[$level - 1]."['$key']";

if(is_array($val)) {
$ks[$level] = $ks[$level - 1]."['$key']";
$return .= buildarray($val, $level + 1, $pre);
} else {
$val =  is_string($val) || strlen($val) > 12 || !preg_match("/^\-?[1-9]\d*$/", $val) ? '\''.addcslashes($val, '\'\\').'\'' : $val;
$return .= $pre.$ks[$level - 1]."['$key']"." = $val;\r\n";
}
}
print_r($ks);
return $return;
}

解决方案 »

  1.   

    就是第一层,刚进来的时候,buildarray($array, $level = 0, $pre = '$_config') 最开始进来的时候$level就是0,那$level-1不就是-1吗,为什么输出的时候是$ks的索引是0而不是-1?
      

  2.   

    我把这个方法提出来后,发现$ks[$level - 1]的索引是-1,  discuz里面只有在这个方法里面声明了$ks,为什么他处理出来的结果就没有-1,怎么也搞不懂
      

  3.   

    你把 $array 打印出来看看
      

  4.   

    Array
    (
        [db] => Array
            (
                [1] => Array
                    (
                        [dbhost] => 127.0.0.1
                        [dbuser] => root
                        [dbpw] => 123
                        [dbcharset] => utf8
                        [pconnect] => 0
                        [dbname] => ultrax_7XhbMs
                        [tablepre] => pre_
                    )            [common] => Array
                    (
                        [slave_except_table] => 
                    )            [slave] => Array
                    (
                    )            [map] => Array
                    (
                    )        )    [memory] => Array
            (
                [prefix] => vQbPi0_
                [eaccelerator] => 1
                [apc] => 1
                [xcache] => 1
                [memcache] => Array
                    (
                        [server] => 
                        [port] => 11211
                        [pconnect] => 1
                        [timeout] => 1
                    )        )    [server] => Array
            (
                [id] => 1
            )    [download] => Array
            (
                [readmod] => 2
                [xsendfile] => Array
                    (
                        [type] => 0
                        [dir] => /down/
                    )        )    [cache] => Array
            (
                [type] => sql
            )    [output] => Array
            (
                [charset] => utf-8
                [forceheader] => 1
                [gzip] => 0
                [tplrefresh] => 1
                [language] => zh_cn
                [staticurl] => static/
                [ajaxvalidate] => 0
                [iecompatible] => 0
            )    [cookie] => Array
            (
                [cookiepre] => AAvI_
                [cookiedomain] => 
                [cookiepath] => /
            )    [security] => Array
            (
                [authkey] => e926f18LJRxCMdzp
                [urlxssdefend] => 1
                [attackevasive] => 0
                [querysafe] => Array
                    (
                        [status] => 1
                        [dfunction] => Array
                            (
                                [0] => load_file
                                [1] => hex
                                [2] => substring
                                [3] => if
                                [4] => ord
                                [5] => char
                            )                    [daction] => Array
                            (
                                [0] => intooutfile
                                [1] => intodumpfile
                                [2] => unionselect
                                [3] => (select
                                [4] => unionall
                                [5] => uniondistinct
                            )                    [dnote] => Array
                            (
                                [0] => /*
                                [1] => */
                                [2] => #
                                [3] => --
                                [4] => "
                            )                    [dlikehex] => 1
                        [afullnote] => 0
                    )        )    [admincp] => Array
            (
                [founder] => 1
                [forcesecques] => 0
                [checkip] => 1
                [runquery] => 1
                [dbimport] => 1
            )    [remote] => Array
            (
                [on] => 0
                [dir] => remote
                [appkey] => 62cf0b3c3e6a4c9468e7216839721d8e
                [cron] => 0
            ))
      

  5.   

        if($level == 0) {
            $ks = array();
            $return = '';
        }如果参数是默认值0,直接返回空字符串了,要执行下面的代码流程,,level参数必然是个非0值
      

  6.   

    但是$ks[$level-1]应该是$ks[-1],我提出来后,就会报错,但是他为什么不报错,难道屏蔽了错误?
      

  7.   

    你没看到是
    $ks[$level] = $ks[$level - 1]."['$key']";
    吗?另有
        if($level == 0) {
            $ks = array();
    递归时
    buildarray($val, $level + 1, $pre);所以 $level 不可能小于 0
    $ks[$level - 1] 也就不可能存在,$ks[$level - 1]只能是空