2012-08-23 38 views
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對象。喜歡聽你的想法。提前致謝。

+0

*也許* http://codereview.stackexchange.com/會更合適? –

+1

如果沒有,至少要顯示一些數據;) – Yoshi

回答

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; 
    } 
} 

這會爲您提供一個呼叫只計算,而不是搞亂你的可變空間:

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

當然,你也可以做一個靜態函數爲你實現instanciation和get _...調用。