foreach循环中的PHP递归函数正在下一个循环中添加以前的数据
我将遍历一些位置,然后调用递归函数来获取这些位置的类别和子类别。 函数返回的数据是前一个循环结果的组合。我怎样才能摆脱这个,请帮助我在这个我的代码看起来像这样foreach循环中的PHP递归函数正在下一个循环中添加以前的数据,php,recursion,foreach,Php,Recursion,Foreach,我将遍历一些位置,然后调用递归函数来获取这些位置的类别和子类别。 函数返回的数据是前一个循环结果的组合。我怎样才能摆脱这个,请帮助我在这个我的代码看起来像这样 foreach ($data as $row) { $get_options = categoryWithSubcategories(0, 0,$row['location_id'],$dbConn); // here I am passing $row['location_id'] to this function, but
foreach ($data as $row) {
$get_options = categoryWithSubcategories(0, 0,$row['location_id'],$dbConn);
// here I am passing $row['location_id'] to this function, but it merge prvious data within next loop.
}
递归函数如下所示
function categoryWithSubcategories($current_cat_id, $count,$locationId,$dbConn)
{
static $option_results;
// if there is no current category id set, start off at the top level (zero)
if (!isset($current_cat_id)) {
$current_cat_id =0;
}
// increment the counter by 1
$count = $count+1;
// query the database for the sub-categories of whatever the parent category is
$sql = "SELECT cat_id, cat_name from tbl_category where cat_parent_id = $current_cat_id and locationid=$locationId and delete_flag='0'";
$stmt = $dbConn->prepare($sql);
$result =$stmt->execute();
$data = $stmt->fetchAll();
$num_options = $stmt->rowCount();
if ($num_options > 0) {
foreach ($data as $categoryList) {
// if its not a top-level category, indent it to
//show that its a child category
if ($current_cat_id!=0) {
$indent_flag = ' ';
for ($x=2; $x<=$count; $x++) {
$indent_flag .= ' >> ';
}
}
$cat_name = $indent_flag.$categoryList['cat_name'];
$option_results[$categoryList['cat_id']] = $cat_name;
// now call the function again, to recurse through the child categories
categoryWithSubcategories($categoryList['cat_id'], $count,$locationId,$dbConn );
}
}
return $option_results;
}
函数类别中的子类别 您已将$option_结果定义为静态。这就是在每次新迭代中合并/添加函数的结果背后的原因 您可以尝试以下方法: 1.从$option_结果中删除静态。 2.存储函数categoryWithSubcategories的结果 在下面一行
categoryWithSubcategories($categoryList['cat_id'], $count,$locationId,$dbConn );
这可以写成
$option_results = array_merge(categoryWithSubcategories($categoryList['cat_id'], $count,$locationId,$dbConn), $option_results) ;
您是否考虑过更改sql以检索所需的所有信息?您是否缺少一个return语句?返回categoryWithSubcategories$categoryList['cat_id']、$count、$locationId、$dbConn;在foreach循环中,您是对的,只是注意到了静态变量。但是你给出的解决方案不起作用。但我有一个想法,我必须处理这个静态变量。你能澄清一下为什么它不起作用吗?它是没有给出预期的结果还是抛出了一些错误?它抛出了警告数组。\u merge first value不是数组。我认为如果控件没有进入这个if块,可能会发生这种情况。如果$num_options>0{。如果在此函数的第一行定义$option_results=array,则可以解决此问题。很高兴提供帮助,如果此答案解决了您的问题,请单击答案旁边的复选标记将其标记为已接受。