递归PHP函数只获取第一个值

时间:2014-05-31 13:44:31

标签: php recursion nested iteration

我遇到以下代码问题。我现在正在尝试一段时间,我相信我必须是盲目的,我没有看到明显的东西。你能指出这个显而易见的事吗?

功能应该是所有类别和它的名称。正确获取ID,但仅为第一个类别和第一个子类别命名。

function collect($id, $current = null) {
    global $db_1;

    $s = "SELECT category.id as id, category_i18n.name as name from category,category_i18n WHERE category.parent_id= '$id' AND category.visible = '1' AND category_i18n.culture='en' AND category.id = category_i18n.id ORDER BY category.order_asc ASC";
    $r = mysql_query($s, $db_1);
    $row = mysql_fetch_array($r);
    $children = array();
    if (mysql_num_rows($r) > 0) {
        while ($row) {
            $children['name'] = $row['name'];
            $children[$row['id']] = collect($row['id']);
        }
    }
else
    {
            $children['name'] = $row['name'];
    }

    return $children;
}

编辑:

EDIT2:

更改后我得到这样的数组:

array(3) {
  ["name"]=>
  string(9) "Cat"
  ["id"]=>
  string(5) "10404"
  ["children"]=>
  array(3) {
    ["name"]=>
    string(10) "Subcat"
    ["id"]=>
    string(5) "10410"
    ["children"]=>
    bool(false)
  }
}

我认为这不是mysql查询的问题,因为在phpmyadmin它可以工作并正确显示所有数据......

1 个答案:

答案 0 :(得分:2)

更新:

您似乎只有1级子目录。你的功能是这样的:

1)首先,它获取给定类别的名称和ID。 2)它使用获取的id来获取子类的名称,该子类具有parent_id =先前获取的id。 3)问题来了。由于递归,它再次使用此子类别的id调用collect()。但是没有子类别,所以它返回null。

即,

第一家长(id1) - >子类别(id2) - >子类别(id2)等等。

您可以使用它来获得任意数量的类别:

function collect($id, $current = null) {
    global $db_1;

    $s = "SELECT category.id as id, category_i18n.name as name from category,category_i18n WHERE category.parent_id= '$id' AND category.visible = '1' AND category_i18n.culture='en' AND category.id = category_i18n.id ORDER BY category.order_asc ASC";
    $r = mysql_query($s, $db_1);
    $temp = array();
    if(mysql_num_rows($r) > 0)
    {
        while($row = mysql_fetch_array($r))
        { 
            $temp[$row['id']]['name'] = $row['name'];
            $temp[$row['id']]['children'] = collect($row['id']); //Get further children (Recursive)
            if(!$temp[$row['id']]['children']) {continue;} // If FALSE is returned, means that this category has no sub categories. Move onto next one.
        }
    }
    else {return FALSE;} //No rows present, return FALSE

    return $temp;
}

此代码未经过测试。您将获得以下格式的数组

$parent[parent_id] -> [name]

                   -> [children] -> FALSE (if subdirectories are not present)

                                 -> [children_id] #1 -> [name]

                                                     -> [children]

                                 -> [children_id] #2 and so on.

更新:你只获得了最后的结果,因为我忘记了一件事。每次在循环中都会覆盖$temp[]数组。