Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自PHP递归的奇怪返回值逻辑错误_Php_Arrays_Recursion_Qcodo - Fatal编程技术网

来自PHP递归的奇怪返回值逻辑错误

来自PHP递归的奇怪返回值逻辑错误,php,arrays,recursion,qcodo,Php,Arrays,Recursion,Qcodo,我需要编写一个递归函数来搜索一组父链接头和子链接头,然后获得每个头中嵌入的键值的名称。例如:衣服->男人->鞋子。现在,每个类别都附加了未知数量的值。我有一个函数,它可以成功地通过父对象递归地回显所有这些值。但是当我试图从函数中获取返回值时,它缺少了一些,我不理解为什么:/ 代码如下 public function getFamilies($cat){ $objCurrentCategory = Category::Load($cat); // creates a QCo

我需要编写一个递归函数来搜索一组父链接头和子链接头,然后获得每个头中嵌入的键值的名称。例如:衣服->男人->鞋子。现在,每个类别都附加了未知数量的值。我有一个函数,它可以成功地通过父对象递归地回显所有这些值。但是当我试图从函数中获取返回值时,它缺少了一些,我不理解为什么:/

代码如下

public function getFamilies($cat){
            $objCurrentCategory = Category::Load($cat); // creates a QCodo object of the passed category ID.

        $str_Query = "SELECT DISTINCT p.family
                      FROM xlsws_product p, xlsws_product_category_assn pc
                      WHERE p.rowid=pc.product_id
                      AND pc.category_id=".$cat; // sql query to retrieve all Families relating to this category.

        $objFamilyDb = Family::GetDatabase(); // retrieves the QCodo database object for Family to execute queries against.
        $objFamilies = Family::InstantiateDbResult($objFamilyDb->Query($str_Query)); // executes the query and saves the result.

        foreach($objFamilies as $family){ // for each family returned, get the family name and add it to the array of names.
            if ($family->Family !== ""){
                $families [] = $family->Family;
            }
        }

        if ($objCurrentCategory->ChildCount > 0){ // if current category has children, create a list of all children rowids.
            $str_Query = "SELECT rowid FROM xlsws_category
                          WHERE parent=".$objCurrentCategory->Rowid; // query to get all children of the category.
            $objChildCategoriesDb = Category::GetDatabase(); // retrieves the QCodo database object for Category to execute queries against.
            $objChildCategories = Category::InstantiateDbResult($objChildCategoriesDb->Query($str_Query)); // executes the query and saves the result.

            foreach($objChildCategories as $child){ // passes through the children to get their families.
                //$families [] = KG::getFamilies($child->Rowid);
                $childFam = KG::getFamilies($child->Rowid);
            }
        }

        $compiled = KG::compileFamilies($childFam); // helper function, not important.


        foreach($compiled as $compile){
            $families[] = $compile;
        }

        foreach($families as $familyt){ // this echo statement correctly displays all names.
            //echo ":".$familyt."<br />";
        }

        return $families;
    }
公共函数getFamilies($cat){
$objCurrentCategory=Category::Load($cat);//创建传递的类别ID的QCodo对象。
$str\u Query=“选择不同的p.family
来自xlsws\U产品p、xlsws\U产品类别\U assn pc
其中p.rowid=pc.product\u id
和pc.category_id=“.cat;//sql查询以检索与此类别相关的所有族。
$objFamilyDb=Family::GetDatabase();//检索要对其执行查询的家族的QCodo数据库对象。
$objFamilies=Family::InstantiateDbResult($objFamilyDb->Query($str_Query));//执行查询并保存结果。
foreach($objFamilies as$family){//对于返回的每个家族,获取家族名称并将其添加到名称数组中。
如果($family->family!==“”){
$families[]=$family->family;
}
}
如果($objCurrentCategory->ChildCount>0){//如果当前类别有子级,请创建所有子级Rowid的列表。
$str\u Query=“从xlsws\u类别中选择行ID
其中parent=“.$objCurrentCategory->Rowid;//查询以获取该类别的所有子级。
$objChildCategoriesDb=Category::GetDatabase();//检索要对其执行查询的类别的QCodo数据库对象。
$objChildCategories=Category::InstantiateDbResult($objChildCategoriesDb->Query($str_Query));//执行查询并保存结果。
foreach($objChildCategories as$child){//通过孩子们找到他们的家人。
//$families[]=KG::getFamilies($child->Rowid);
$childFam=KG::getFamilies($child->Rowid);
}
}
$compiled=KG::compileFamilies($childFam);//辅助函数,不重要。
foreach($编译为$compile){
$families[]=$compile;
}
foreach($families as$familyt){//此echo语句正确显示所有名称。
//echo:“$familyt.”
; } 返回$families; }
因此,在函数运行期间,通过echo将所有名称显示在屏幕上,并且函数中的数组也可以回显到屏幕上。但当我试图在另一个页面中返回返回结果中的所有名称时,我丢失了一堆名称


EDIT似乎$families变量在每次递归调用getFamilies时都不会持久化,并且只在最后返回子项,而不是子项及其所有父项。

已修复。问题是,我试图在同一个递归语句中清理数组,但由于返回的是清理“helper方法”,而不是完整的族关联数组,所以它会将所有内容都丢弃。叹息@me的健忘。

为什么你会期望家庭的价值在多次通话中持续存在?递归并不维护调用方的相同作用域,它仍然是一个新函数调用,在其作用域中定义了变量。好的,最终输出应该是所有族的集合,而不仅仅是该单例调用的子集。这就是递归的全部要点。但我还是让它工作了。我对这个问题的解释有点混乱。我的错。我完全知道每个函数调用都是唯一的,只是意味着最终结果应该是所有调用的串联。嗯,除了那部分,我觉得自己像个白痴,因为我浪费了几个小时不理解,哈哈。