簡體   English   中英

PHP遞歸函數嵌套級別已達到

[英]PHP recursive function nesting level reached

美好的一天。 我有一個parcer函數,它接受像這樣的字符串數組:

['str','str2','str2','*str','*str2','**str2','str','str2','str2']

然后遞歸地提高一個以asterix開頭的級別

['str','str2','str2',['str','str2',['str2']],'str','str2','str2']

函數是:

function recursive_array_parser($ARRAY) {
    do {

        $i = 0;
        $s = null;
        $e = null;
        $err = false;

        foreach ($ARRAY as $item) {

            if (!is_array($item)) { //if element is not array
                $item = trim($item);
                if ($item[0] === '*' && $s == null && $e == null) { //we get it's start and end if it has asterix
                    $s = $i;
                    $e = $i;
                } elseif ($item[0] === '*' && $e != null)
                    $e = $i;
                elseif (!isset($ARRAY[$i + 1]) || $s != null && $e != null) { //if there are no elements or asterix element ended we elevate it
                    $e = $e == NULL ? $i : $e;
                    $head = array_slice($ARRAY, 0, $s);
                    $_x = [];
                    $inner = array_slice($ARRAY, $s, $e - $s + 1);
                    foreach ($inner as $_i)
                        $_x[] = substr($_i, 1);

                    $inner = [$_x];
                    $tail = array_slice($ARRAY, $e + 1, 999) or [];
                    $X = array_merge($head, $inner);
                    $ARRAY = array_merge($X, $tail);

                    $s = null;
                    $e = null;
                    $err = true;
                }
            } else {
                $ARRAY[$i] = recursive_array_parser($ARRAY[$i]); //if the item is array of items we recur.
            }
            $i++;

            if ($err == true) {
                break 1;
            }
        }
    } while ($err);
    return $ARRAY;
}

運行此函數時,出現“嚴重錯誤:達到'200'的最大函數嵌套級別,正在中止!” 錯誤。

我知道它與無限遞歸有關,但是我無法跟蹤發生它的特定位置,這很奇怪。

我通常不重寫代碼,但是據我所知,可以減少和簡化您的代碼,並獲得理想的結果。 看看這是否適合您:

$a = array('a','b','c','*d','*e','**f','g','*h');
print_r($a);
$a = recursive_array_parser($a);
print_r($a);
function recursive_array_parser($array)
{
    $ret = array();
    for($i=0; $i<sizeof($array); $i++)
    {
        if($array[$i]{0}!='*') $ret[] = $array[$i];
        else
        {
            $tmp = array();
            for($j=$i; $j<sizeof($array) && $array[$j]{0}=='*'; $j++)
            {
                $tmp[] = substr($array[$j],1);
            }
            $ret[] = recursive_array_parser($tmp);
            $i = $j-1;
        }
    }
    return $ret;
}

請注意,$ array [$ i]不可能是數組,因此將刪除檢查。 遞歸在找到*時創建的臨時數組上進行。 $ i與$ array緊密關聯,以便在分析一系列*元素后正確重置它。

這是我的解決方案。 沒有嵌套循環。

function recursive_array_parser($arr) {
    $out = array();
    $sub = null;
    foreach($arr as $item) {
        if($item[0] == '*') { // We've hit a special item!
            if(!is_array($sub)) { // We're not currently accumulating a sub-array, let's make one!
                $sub = array();
            }
            $sub[] = substr($item, 1); // Add it to the sub-array without the '*'
        } else {
            if(is_array($sub)) { 
                // Whoops, we have an active subarray, but this thing didn't start with '*'. End that sub-array
                $out[] = recursive_array_parser($sub);
                $sub = null;
            }
            // Take the item
            $out[] = $item;
        }
    }

    if(is_array($sub)) { // We ended in an active sub-array. Add it.
        $out[] = recursive_array_parser($sub);
        $sub = null;
    }

    return $out;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM