2016-04-14 4 views
0

私はクラス内で再帰関数を使用しています。この関数は、変数$estadosの値を変更します。最初の呼び出しではすべてが正常です.2番目の呼び出しでは、関数は関数の最後の呼び出しの変数の値を変更します。PHP - 最後の呼び出しと同じ変数を使用する再帰関数

これは私のコードです。

class Trab3Code 
{ 
    public function fechoEpsilon($automato, $estado) 
    { 
     $estados = $automato->transicao($estado, '&'); 
     $fechos = array(); 
     if (!empty($estados)) { 
      foreach ($estados as $elemento) { 
       $fechos[] = $this->fechoEpsilon($automato, $elemento); 
      } 
     } 

     $estados[] = $estado; 

     return array_unique(array_merge($estados, $fechos)); 
    } 
} 

私は$automato変数の関数から$estado変数の新しい値を取得します。関数の戻り値は配列です。最初の実行では、すべてが大丈夫です。 2回目の実行では、関数の戻り値は空の​​配列になり、それは最初の実行の以前の値よりも優先されます。

誰でも手伝ってもらえますか?

--- EDIT ---

私の関数の最初の呼び出しはfechoEpsilon($automato, 0)です。 は$estadosの値が含まれている必要があります言われていること、少なくとも:最初のコール しかし、私は取得していた結果である

array(
    0 => 1 
    1 => 3 
) 

空の配列です。それともそれは、複雑にautomatasについては、この作品を見える場合

$estados[] = $estado; 

申し訳ありませんが、この行にsettedされるだけ0値を持つ配列。 fechoEpsilon関数は、オートマトン内の状態のEpsilon Closureを計算します。

私は値が変化していることを知っていますが、それはわかりません。変数の値を呼び出しにダンプすると、変数が変更され、最終的には最後の呼び出しの値が返されます。これは空の配列です。 静的メソッド呼び出しについて申し訳ありませんが、間違いでしたが、$thisで使用していました。私はコードを更新しました。

+6

'$ estados'はローカル変数です。再帰呼び出しでそれを変更しても、元の呼び出しには影響しません。 – Barmar

+1

静的メソッドではありませんが、静的に 'Trab3Code :: fechoEpsilon'を呼び出しています – Manulaiko

+0

@Manulaikoメソッドは' $ this'を使用しないので、静的メソッドのように使うことができます。 – Barmar

答えて

0

私は何が起こったのか分かりません。私はarray_unique関数を取り出して、今はすべてうまく動いています。

明らかに、array_uniqueの使用に問題がありました。なぜなら、コードの一部で配列の中に配列を取得していたからです。どういうわけかすべてを盗んだ。

ご協力ありがとうございます。o/

関連する問題