0

PHP オブジェクト (または配列) があり、その要素とそのすべての子要素を再帰的に反復処理し、どの要素が最も多くの子を持つかを見つけたいと考えています。

これが私がやったことです。

var $max_element = array();

$this->find_longest_element_recursively($data, 0, array());

public function find_longest_element_recursively($object, $index, $max_array) {

  if(!is_array((array) $object) || is_string($object) || is_numeric($object) || is_bool($object)) {

  } else {
    foreach($object as $key => $element) {
      if(sizeof((array) $element) > sizeof((array) $this->max_array)) {
        $this->max_array = $element;
      }
      $this->find_longest_element_recursively($element, $index+1, $max_array);
    }
  }     
}

わかった。だからこれは私のために働く。しかし、これが再帰を行う適切な方法だとは思いません。その $max_element 変数を取り除き、再帰関数の結果として実際の max_element オブジェクトを返すことができると思いますが、再帰中に max_element オブジェクトを追跡する方法がわかりません。あなたの考えを聞くのが大好きです。前もって感謝します。

4

1 に答える 1

0

これをクラスで囲むことができます:

class MaxFinder {

    var $max_element = array();
    function MaxFinder() {
    }

    public function find_longest_element_recursively($object, $index, $max_array) {

      if(!is_array((array) $object) || is_string($object) || is_numeric($object) || is_bool($object)) {

      } else {
        foreach($object as $key => $element) {
          if(sizeof((array) $element) > sizeof((array) $this->max_array)) {
            $this->max_array = $element;
          }
          $this->find_longest_element_recursively($element, $index+1, $max_array);
        }
      }     
     }

     public get_longest_element($object, $index, $max_array) {
          $this->find_longest_element_recursively($object, $index, $max_array);
          return $this->max_element;
     }
}

これにより、1回の呼び出しのみの計算が提供され、変数スペースが乱雑になりません。

 $result = (new MaxFinder()).get_longest_element_recursively($data, 0, array());

もちろん、インスタンス化と get_... 呼び出しを行う静的関数を作成することもできます。

于 2012-08-23T07:48:03.717 に答える