PHP ağaç uygulama: yineleme döngü tanımlama ana referans

1 Cevap php

Geri JaxpTree nesne. Ağaç gibi ilişki aşağıdaki iç içe bir ağaca MySQL ile ilgili tablo çifti dönüştürmek gerekiyordu:


    /**
     * Generates a JaxpTree structure. Parameters are used by the recursive
     * function. Normally, they shouldn't be specified.
     *
     * @param   int     $parent_id
     * @param   string  $source_table
     * @param   bool    $include_childs
     *
     * @access  public
     * @return  JaxpTree
     * @since   1.0
     */
    function CreateTree(
        $parent_id = 0,
        $source_table = "_NodeTable",
        $include_childs = true
    )
    {
        # Copy field names to local variables for shortness.
        $pfId = $this->_ParentIdField;
        $fId  = $this->_IdField;
        $fL   = $this->_LabelField;

        # Determine source table. The iteration begins using NodeTable,
        # then, to fetch the items, uses ItemTable.
        $source_table = !$source_table ? "_NodeTable" : $source_table;

        # Get all rows from the source table.
        $rows = $this->{$source_table}->GetById($pfId, $parent_id, true);

        # If no rows, no process will be done.
        if ($rows)
        {
            # Iterate through the row list.
            foreach ($rows as $r)
            {
                # Get label and id values.
                $label = $r->Columns[$fL]->Value;
                $id = $r->Columns[$fId]->Value;

                # If this node has childrens...
                if ($this->{$source_table}->GetById($pfId, $id) && $include_childs)
                {
                    # Do recursive call using this node as root.
                    $array[$label] = $this->CreateTree($id);

                    # If this node has items...
                    if ($this->_ItemTable->GetById($pfId, $id))
                    {
                        # Do recursive call using this node as root
                        # scanning the item table.
                        $array[$label]->ItemList = $this->CreateItemList($id);
                    }
                }
                else # This node has no child, so there's no need for
                     # more nested trees.
                {
                    # Create a new TreeNode.
                    $new_node = new JaxpTreeNode($id);

                    # Send a JaxpMySqlRow object to the node.
                    # This will turn the row into node elements.
                    $new_node->LoadFromMySqlRow($r);

                    # Store the node.
                    $array[] = $new_node;
                    if ($source_table != "_ItemTable")
                    {
                        $array[$new_node->Attributes->Get($fL)->Value] = $new_node;
                    }

                    # If the node has items...
                    if ($this->_ItemTable->GetById($pfId, $id))
                    {
                        # Do recursive call using this TreeNode as root
                        # scanning the item table.
                        $new_node->ItemList = $this->CreateItemList($id);
                    }
                } # End checking for children.
            } # End iterating the row list.
        } # End checking for rows.

        # Return a JaxpTree object, using the array as contents.
        return (isset($array)
                ? new JaxpTree(
                        $array, null,
                        ($parent_id
                        ? $this->CreateTree($parent_id, "_NodeTable", false)
                        : null)
                  )
                : false);
    } // CreateTree()

Ben ek ebeveyn referans (italik satırına bakınız) ile nesneyi döndürmek için çalıştığınızda, ben sonsuz özyineleme döngü ve PHP çöker yakalanmayın.

Ben burada yanlış Nereye gidiyorum?

1 Cevap

Bu kadar gördüğünüz gibi kodunuzu yerde değiştirilmiş değil beri özyinelemeli çağrı sağlamak $ parent_id her zaman, ilk çağrı kullanılan biri olarak aynı olacaktır. Yani bu tekrar tekrar aynı parametrelerle aynı işlevi çağırarak sonsuz bir döngü oluşturmak, senin sorunun.