Olmayan bir kuyruk özyinelemeli fonksiyon optimize

4 Cevap php

Kimin gerekli aşağıdaki gibi işlemleri özetlenen bu işlevi vardır:

function render($index) {
    foreach($things[$index] as $key => $data) {
        echo '<div>';
        /* irrelevant operations */
        if(isset($data['id'])) {
            echo '<div class="wrap">';
            render($things[$data['id']]);
            echo '</div>';
        }
        echo '</div>';
    }
}

Ben bana yaşam için bu fonksiyonu optimize etmek için nasıl anlamaya değil; Ben çağrı yığını çok büyük alırsa PHP implode korkuyorlar.

Bu fonksiyonu optimize etmek için herhangi bir yolu var mı?

4 Cevap

Bu kod denenmemiş, ama kafamın üstünden, yinelemeli işlevi bu gibi görünmelidir:

function render($index){
	$stack = array();
	array_push($index);

	$pre = '';
	$post = '';

	while(!empty($stack)){
		$idx = array_pop($stack);

		foreach($things[$idx] as $key => $value){
			$pre .= '<1>';
			$spost = '';

			if(isset($data['id'])){
				$pre .= '<2 class="wrap">';
				$spost .= '</2>';

				$stack[] = $things[$data['id']];
			}

			$spost .= '</1>';
			$post .= $spost;
		}
	}

	return $pre . $post;
}

Bu endişelenmenize gerek son derece şüphelidir. Eğer çağrı yığını kadar doldurur ki yeterince derin divs yuvalama ediyorsanız, yineleme derinliği endişeler az olan.

Ne yaptığınızı etkili bir ağaç geçme edilir. Temel olarak, bu sadece bir ağaç tüm değerlerini baskı daha kötüdür. Eğer çok büyük alma ile herhangi bir sorun yaşadınız mı? Bu ağaç nasıl iç içe olduğunu?

Eğer ağacın bir derinlik ilk kastetmek yapmak için özyineleme kullanmak gerekmez; sadece gerçekten iyi çalışmak olur. Yığını üfleme bir endişe varsa, sadece en son ve güncel mevkilerde tüm unsurları üzerinde uzun bir döngü çalıştırmak olabilir. Özyineleme olsa derinlik ilk kastetmek gerçekleştirmek için basit ve (genellikle) daha iyi bir yoldur.