2016-03-22 18 views
1

Diziyi bir ağaç olarak görüntülemek için nasıl bir işlev oluşturabilirim. Mesela, dalların değerlerine dayanan yapraklara ulaşana kadar yürümek istediğim bir karar ağacı elde etmek istiyorum. Ben bağırma gibi ağaç oluşturmak:Diziyi bir ağaç olarak görüntülemek için nasıl bir işlev oluşturabilirim?

$tree= new DS_Tree(); 
$node=array('name' => 'start'); 

$tree->insert_node($node); 
$tree->goto_root(); 

    $mytree = new id3(); 
    $mytree->init($data_array_AttrList,$data_array_values,$data_class,$data_array_instances,$tree); 
    $mytree->run(); 
    echo '<pre class="brush: php">'; 
     print_r($mytree->tree->draw_tree()); 
    echo '</pre>'; 

fonksiyon draw_tree() geçerli:

public function draw_tree() { 
    return $this->nodes; 
} 

benim ağaç oluşturur fonksiyonudur:

private function make_tree($attr) { 
    foreach($this->Values[$attr] as $v) { 
     $subset = $this->get_subset($attr, $v); 
     if($the_class = $this->has_same_class($subset)) { 
      $node =array(
       'name' => $attr, 
       'arc' => $v 

      ); 
      $this->tree->insert_node($node); 

      $this->Instance = array_diff_key($this->Instance, $subset); 
     } else { 
      $node =array(
       'name' => $this->Classa, 
       'arc' => $v 
      ); 

      $unresolved = $this->tree->insert_node($node); 
     } 
    } 

    if (isset($unresolved)) { 

     $this->tree->goto_index($unresolved); 

    } 

    } 
} 

sonucudur:

Array 
(
[0] => Array 
    (
     [name] => Time 
     [parent] => 
     [children] => Array 
      (
       [0] => 1 
      ) 

    ) 

[1] => Array 
    (
     [name] => Focus 
     [arc] => Array 
      (
       [0] => 2 day/week 
       [1] => 3 day/week 
       [2] => 4 day/week 
       [3] => 5 day/week 
       [4] => 6 day/week 
      ) 

     [parent] => 0 
     [children] => Array 
      (
       [0] => 2 
      ) 

    ) 

[2] => Array 
    (
     [name] => Dificulty 
     [arc] => Array 
      (
       [0] => Weght loss 
       [1] => Mantain weight 
       [2] => Gain Mass 
      ) 

     [parent] => 1 
     [children] => Array 
      (
       [0] => 3 
      ) 

    ) 

[3] => Array 
    (
     [name] => Sex 
     [arc] => Array 
      (
       [0] => Beginner 
       [1] => Intermediar 
       [2] => Advance 
      ) 

     [parent] => 2 
     [children] => Array 
      (
       [0] => 4 
      ) 

    ) 

[4] => Array 
    (
     [name] => Array 
      (
       [Exercise] => Array 
        (
         [0] => Array 
          (
           [0] => Ex1 
           [1] => Ex2 
           [2] => Ex3 
           [3] => Ex4 
           [4] => Ex5 

          ) 

        ) 

      ) 

     [arc] => Array 
      (
       [0] => F 
       [1] => M 
      ) 

     [parent] => 3 
    ) 

) 

cevap

1

Sadece görüntülemek için Böyle diyoruz olsaydı, sağlanan

function recurseFind($tree, $find, $path = "") { 
    if (!is_array($tree)) { 
     // it is a leaf: 
     if ($tree === $find) { 
      return $path; // return path where we found it 
     } 
     return false; 
    } 
    foreach($tree as $key => $value) { 
     $result = recurseFind($value, $find, $path . (is_numeric($key) ? "[$key]" : "['$key']")); 
     if ($result !== false) return $result; 
    } 
    return false; 
} 

örnek girişi için: Bir ağaç olarak dizi: Burada

echo "<pre>"; 
var_dump($array); 
echo "</pre>"; 
0

bu veri yapısı yineleme ve belli bir değere bakmak için bir yoldur :

echo recurseFind($tree, "Mantain weight", '$tree'); 

Çıkışlar PHP değerlendirilecek bir biçimde bu değer (ilk maçında yalnızca) "konumu":

$tree[2]['arc'][1] 
+0

ve bu ağacı nasıl yürütebilirim? çünkü kullanıcı – Ciro

+0

'dan gelen giriş verileriyle karşılaştırmak istiyorum. Sorunuzu güncelleyebilir ve bu tür bir girdi verebilir misiniz? – trincot

+0

kullanıcı böyle bir giriş tanıtmak ise örneğin: Zaman = 2 gün/hafta, Odak = = EX2 (örneğin) – Ciro

İlgili konular