Basit PHP Özyineleme Testi Başarısız

5 Cevap php

Ben bir inputed dizinin değerlerine dayalı çok boyutlu diziler oluşturmak için temel bir özyineleme çalışılıyor.

Yineleme biz döngü başlatmak için "özyineleme" diyoruz ve biz sonuna kadar "stop_recursion" diyeceğiz başka bir değer arar eder bir değer için kontrol ederek çalışır.

Temelde bu diziyi alıyor

array('One', 'Two', 'recursion', 'Three', 'Four', 'Five', 'stop_recursion', 'Six', 'Seven')

Bu dizi yapmak

array('One', 'Two', array('Three', 'Four', 'Five'), 'Six', 'Seven')

Aşağıdaki gibi ben şimdiye kadar bunun için var kodu

function testRecrusion($array, $child = false)
{
    $return = array();

    foreach ($array as $key => $value) {
    	if ($value == 'recursion') {
    		unset($array[$key]);
    		$new = testRecrusion($array, true);
    		$array = $new['array'];
    		$return[] = $new['return'];
    	} else {
    		if ($value == 'stop_recursion') {
    			unset($array[$key]);
    			if ($child) {
    				return array('return' => $return, 'array' => $array);
    			}
    		} else {
    			unset($array[$key]);
    			$return[] = $value;
    		}
    	}
    }

    return $return;
}

Ama bu ikinci çıkışı

Array
(
    [0] => One
    [1] => Two
    [2] => Array
        (
            [0] => Three
            [1] => Four
            [2] => Five
        )

    [3] => Three
    [4] => Four
    [5] => Five
    [6] => Six
    [7] => Seven
)

Ben ... asıl soru sanırım ilk çağrı veya bir kez verilen ilk değerler üzerinden bir dizi değerleri sürekli döngü yeni dizi döndürülür ve dizi yeni dizi aracılığıyla döngü o olacak. Ben cevap evet, eski dizi değeri devam edeceğini söyleyerek burada temelde olduğunu biliyorum, ama gereken bu iş tam tersi değil?

Herhangi bir yardım takdir edilecektir :)

------------ Edit -------------------

Ben de ben çok daha basit bir yöntem kullanarak bu eylemi gerçekleştirmek olurken, bu çocuk dizileri bir sonsuz sayıda olabilir bir dize çözümleyici taşıdık olacağından ardışık kontrol edilmesi gerektiğini ekleyebilirsiniz.

5 Cevap

Eğer özyineleme içinde iade ederken, iç dizi ve iki kez aynı elemana bakmak gerekmez böylece elemanlar aramaya devam etmek için hangi indeksi hem dönmek gerekiyor. Bunun yerine bu deneyin:

function testRecursionImpl($array, $i)
{
    $return = array();

    for (; $i < sizeof($array); ++$i) {
        if ($array[$i] == 'recursion') {
    		$new = testRecursionImpl($array, $i + 1);
    		$return[] = $new[0];
    		$i = $new[1];
        } else if ($array[$i] == 'stop_recursion') {
    		return array($return, $i);
    	} else {
    		$return[] = $array[$i];
    	}
    }

    return array($return, $i);
}

function testRecursion($array)
{
    $result = testRecursionImpl($array, 0);
    return $result[0];
}

Eğer yukarıdaki kodu var sorun yinelemeli bu fonksiyonu çağırmak ne zaman doğru tespit olduğunu ancak çalışmıyor bitirir ve çıkış diziye sonuçları append kez sadece (özyineli çağrı alacak ilk elemanı olan) bir sonraki öğeyi seçin ve çıkış diziye ekleyebilir. Ne muhtemelen yapmak istiyorsanız size stop kelime bulana kadar yinelemeli diğer tüm karakterleri atlamak etmelisiniz fonksiyonu çalıştırmak gerektiğini tespit durumdur (stop_recursion). Eğer onlar farklı seviye çağrı olabilir, çünkü çok düzeyli özyineleme sonra hatta bazı stopwords atlamak gerekebilir izin Açıkçası eğer sorun zorlaşacaktır.

Eğer böyle bir özellik istiyorum neden hala bilmiyorum. Belki size ulaşmak için çalışıyoruz ne açıklardı. Ben başka, bunu yapmanın basit bir yolu var eminim.

Aksine ev ödevlerinde yardım daha, ben bu satırın kurtulmak başlamak öneririm:

foreach ($array as $key => $value) {

Gerçekten sonsuz olamaz beri sadece zaman yapılır bilmek, sizin dizideki geçmek ve dizinin sonunda olmak için kontrol etmelisiniz.

Bana bunu bir deneyelim

function testRecursion($arr){
    $return = array();
    $recurlevel = 0;
    foreach ($arr as $v) {
      if($v == 'stop_recursion'){
        $recurlevel--;
      }
      if($recurlevel == 0){
        if(isset($current)){
          $return[] = testRecursion($current);
          unset($current);
        }else{
          if($v != 'recursion'){
            $return[] = $v;
          }
        }
      }else{
        if(!isset($current)){
           $current = array();
        }
        $current[] = $v;
      }
      if($v == 'recursion'){
        $recurlevel++;
      }
    }

    return $return;
}

Tamam güzel yapılır. Bu özyineleme ve stop_recursion içiçe geçmiş bile yardımcı olacaktır. Örneğe bakın:

code.php:

<pre><?php

function testRecursion($arr){
    $return = array();
    $recurlevel = 0;
    foreach ($arr as $v) {
      if($v == 'stop_recursion'){
        $recurlevel--;
      }
      if($recurlevel == 0){
        if(isset($current)){
          $return[] = testRecursion($current);
          unset($current);
        }else{
        if($v != 'recursion'){
          $return[] = $v;
        }
        }
      }else{
        if(!isset($current)){
           $current = array();
        }
          $current[] = $v;
      }
      if($v == 'recursion'){
        $recurlevel++;
      }
    }

    return $return;
}

$a = array('One', 'Two', 'recursion', 'Three', 'recursion', 'Four' , 'stop_recursion', 'Five', 'stop_recursion', 'Six', 'Seven');
var_dump(testRecursion($a));

?>

Tarayıcı çıkış:

array(5) {
  [0]=>
  string(3) "One"
  [1]=>
  string(3) "Two"
  [2]=>
  array(3) {
    [0]=>
    string(5) "Three"
    [1]=>
    array(1) {
      [0]=>
      string(4) "Four"
    }
    [2]=>
    string(4) "Five"
  }
  [3]=>
  string(3) "Six"
  [4]=>
  string(5) "Seven"
}

Özyinelemeli çözüm için soru zaten cevap beri ... Ben bir yığın tabanlı bir çözüm sunabilir?

$x = array('a', 'b', 'recursion', 'cI', 'cII', 'cIII', 'recursion', 'cIV1', 'cIV2', 'cIV2', 'stop_recursion', 'stop_recursion', 'd', 'e');

$result = array();
$stack = array(&$result);
foreach($x as $e) {
  if ( 'recursion'===$e ) {
    array_unshift($stack, array());
    $stack[1][] = &$stack[0];
  }
  else if ( 'stop_recursion'===$e ) {
    array_shift($stack);
  }
  else {
    $stack[0][] = $e;
  }
}

var_dump($result);

baskılar

array(5) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  array(4) {
    [0]=>
    string(2) "cI"
    [1]=>
    string(3) "cII"
    [2]=>
    string(4) "cIII"
    [3]=>
    array(3) {
      [0]=>
      string(4) "cIV1"
      [1]=>
      string(4) "cIV2"
      [2]=>
      string(4) "cIV2"
    }
  }
  [3]=>
  string(3) "d"
  [4]=>
  string(5) "e"
}