Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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_Loops_Recursion_Categories - Fatal编程技术网

Php 类的递归循环

Php 类的递归循环,php,loops,recursion,categories,Php,Loops,Recursion,Categories,我正在尝试在我的网站上实现一个分类系统。问题是一个类别可能有子类别。 到目前为止,我的表category如下所示: id, name, parent_id 到目前为止,我做了一个循环,但它只适用于2个级别。这是我的密码: for($i=0;$i<count($data);$i++){ $tree[$data[$i]->name] = array(); for($j=0;$j<count($data);$j++){ if($data[$j]-&g

我正在尝试在我的网站上实现一个分类系统。问题是一个类别可能有子类别。 到目前为止,我的表
category
如下所示:

id, name, parent_id
到目前为止,我做了一个循环,但它只适用于2个级别。这是我的密码:

for($i=0;$i<count($data);$i++){
    $tree[$data[$i]->name] = array();
    for($j=0;$j<count($data);$j++){
        if($data[$j]->parent_id == $data[$i]->id){
            $tree[$data[$i]->name][] = $data[$j]->name;
        }
    }
}
我如何才能使其高效和递归,使其更像:

Array
(
    [0] => Array
        (
            [1] => Cat1
            [children] => Array
                (
                    [12] => sub cat 1
                    [13] => sub cat 2
                    [14] => sub cat 3
                        [children] => Array
                            (
                                [1] => sub sub cat 1
                            )
                )

        )

    [1] => Array
        (
            [2] => Cat2
        )

    [2] => Array
        (
            [3] => Cat3
        )
)
谢谢你的帮助

编辑

我正在处理Zend,它返回给我
数据
,因为它:

Zend_Db_Table_Rowset Object
(
    [_data:protected] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [name] => Cinema
                    [type] => category
                    [slug] => cinema
                    [parent_id] => -1
                )

            [1] => Array
                (
                    [id] => 2
                    [name] => Horror
                    [type] => category
                    [slug] => horror
                    [parent_id] => 1
               )

如果要应用这种类型的结构,最好在其他表中使用父id作为外键的
child
。 因此,你可以有递归类别张贴。 所以表的结构是这样的

ch_id, parent_id, child
您应该签出一种在关系数据库中存储和检索日期树的方法(实际上您的类别是什么)。为此,您必须稍微调整数据库方案(如链接或有关嵌套集的几个教程中所述)。例如,对于PHP,有几个库提供了嵌套集功能。

这应该可以帮助您解决这个问题。 它迭代数组的每个成员,并检查它在每个级别和依赖关系的树结构中的位置

function get_children($data, $parent_id = false) {
  $result = array();
  foreach ($data as $i => $content) {
    if ($parent_id != false && $content['id'] != $parent_id)  # other levels
      continue;
    if ($parent_id === false && !empty($content['parent_id'])) # top level
      continue;

    $leaf = array(
      'id' => $content['id'],
      'parent_id' => $content['parent_id'],
      'name' => $conten['name']
    );
    $leaf['children'] = get_children($data, $leaf['id']);
    $result[$leaf['id']] = $leaf;
  }
  return $result;
}

$result =  get_children($data);
print_r($result);

编辑:bug fixes

您好,是的,我知道,但不幸的是,我没有选择权,我必须以现在的方式使用它,直到您想要嵌套类别的级别?????如果您有2-3层,那么您的代码将执行多一个for循环…嵌套级别没有限制。在这种情况下,我应该只使用两个表吗?比使用两个表更好…这样查询将在两个表上共享,并将为uHi带来一些快乐,谢谢,但仍然不起作用,但我现在更接近于解决它。实际上,如果($content['id']==$data['parent\u id']){这一行不能工作,因为$data是所有类别的数组,所以我不能通过$data['parent\u id'访问它 directly@user1965817啊,你是对的,等一下,我会把它修好的。会稍微慢一点的。嗯,是的,你是对的,它太慢了。我有一个致命的错误:允许的内存大小,所以我可能会选择两个表,在这种情况下,可能会简单得多。想?@user1965817允许的内存大小不应该生效。至少如果你有一个几千个类别。这只是意味着,其中一个中断条件不起作用。你的数据是周期性的吗?
function get_children($data, $parent_id = false) {
  $result = array();
  foreach ($data as $i => $content) {
    if ($parent_id != false && $content['id'] != $parent_id)  # other levels
      continue;
    if ($parent_id === false && !empty($content['parent_id'])) # top level
      continue;

    $leaf = array(
      'id' => $content['id'],
      'parent_id' => $content['parent_id'],
      'name' => $conten['name']
    );
    $leaf['children'] = get_children($data, $leaf['id']);
    $result[$leaf['id']] = $leaf;
  }
  return $result;
}

$result =  get_children($data);
print_r($result);