【问题标题】:PHP dynamic categories function concat not workingPHP动态类别功能concat不起作用
【发布时间】:2019-03-18 20:21:39
【问题描述】:

我正在处理一个具有类别、子类别、子子类别等的项目。用户可以创建它们。我想把它们展示在桌子上。 我使用这个函数,但返回只给我父母类别(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('&nbsp;', 5));
            }
            return $catsSubcats;
        }
    }

【问题讨论】:

  • 您是否希望此函数将数据写入您的表?没有INSERTUPDATE 查询,不清楚您要完成什么
  • 您没有使用递归调用的结果。您的意思是将其附加到输出字符串吗?
  • 点赞$catsSubcats .= categoryTree(...)
  • 我想将所有类别和子类别附加到一个输出字符串。
  • 非常感谢“不要惊慌”...是的,这就是我想要的

标签: php


【解决方案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('&nbsp;', 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;
}

【讨论】:

    【解决方案2】:

    您没有在递归中使用返回值。 可能你想要这样的东西:

    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('&nbsp;', 5));
                }
            }
            return $catsSubcats;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 1970-01-01
      • 2012-10-07
      • 2018-03-20
      • 2013-04-18
      相关资源
      最近更新 更多