我正在处理具有类别,子类别,子子类别等的项目。用户可以创建它们。我想将它们显示在桌子上。 我使用此函数,但返回仅给我父母类别(parent_id = 0)。它错过了子类别,而子子... 如果我放置var_dump,则表明连接正在工作,但是当函数找到另一个类别父对象时,该数据将丢失。我在做什么错了,请帮忙。
我想返回一个包含所有类别和子类别的变量。
function categoryTree($catsSubcats = "", $parent_id = 0, $sub_mark = ""){ var_dump($catsSubcats);
$stmt = Conexion::conectar()->prepare("SELECT * FROM categorias_compra WHERE parent_id = $parent_id");
$stmt -> execute();
$respuesta = $stmt -> fetchAll();
if($respuesta){
foreach($respuesta as $key => $value){
$catsSubcats = $catsSubcats . $sub_mark.$value['nombre'].'<br>';
categoryTree($catsSubcats, $value['id'], $sub_mark.str_repeat(' ', 5));
}
return $catsSubcats;
}
}
答案 0 :(得分:1)
主要问题是没有使用递归调用的结果,但是如果将其追加到字符串中,看起来将导致大量重复。
我认为您不需要将主字符串传递给递归调用。这就是导致重复结果的原因。您只需要追加递归调用的结果,而不是该结果加上您此时已拥有的所有内容。
此外,如果递归地传递准备好的语句,则应该能够重用它,而不必重复准备相同的事情。
我无法真正测试它,但我认为这会更好。
function categoryTree($parent_id = 0, $sub_mark = "", $stmt = null) {
if (!$stmt) {
// only prepare the first time, then pass the prepared statement to subsequent calls
$stmt = Conexion::conectar()->prepare("SELECT * FROM categorias_compra WHERE parent_id = ?");
}
// bind $parent_id to the ? placeholder in the prepared statement
$stmt->execute([$parent_id]);
$respuesta = $stmt->fetchAll();
// initialize the result of each call to an empty string
$catsSubcats = "";
if ($respuesta) {
// you can also move this before the loop so it only has to execute once
$sub_mark .= str_repeat(' ', 5);
foreach ($respuesta as $key => $value) {
$catsSubcats .= $sub_mark.$value['nombre'].'<br>';
$catsSubcats .= categoryTree($value['id'], $sub_mark, $stmt);
}
}
// always return a string
return $catsSubcats;
}
答案 1 :(得分:0)
您没有在递归中使用返回值。 可能您想要这样的东西:
function categoryTree($parent_id = 0, $sub_mark = ""){
$catsSubcats='';
$stmt = Conexion::conectar()->prepare("SELECT * FROM categorias_compra WHERE parent_id = $parent_id");
$stmt -> execute();
$respuesta = $stmt -> fetchAll();
if($respuesta){
foreach($respuesta as $key => $value){
$catsSubcats .= $sub_mark.$value['nombre'].'<br>';
$catsSubcats .= categoryTree($value['id'], $sub_mark.str_repeat(' ', 5));
}
}
return $catsSubcats;
}