排序步骤和子步骤

时间:2012-06-03 03:46:17

标签: php mysql recursion

我有一个应用程序需要能够从数据库中获取过程并以正确的顺序显示步骤。有时,步骤有子步骤,有时,这些子步骤可以有自己的子步骤。我不能为每个程序编写一个单独的html页面,因为我们正在谈论它们中的很多。我打算动态生成视图。以下是我要展示的示例:

1. Step 1
  a. Step 1a
    i. Step 1ai
    ii. Step 1aii
  b. Step 1b
2. Step 2

目前看来,我有一个PROCEDURE表,一个STEP表和一个PROCEDURE_STEP表来交叉引用它们。 STEP表有一个substep_of字段,它是父步骤id的外键。我仍然处于可以根据需要修改数据库的阶段。

我的问题是,在我这样做之后:

mysql_query(SELECT * FROM PROCEDURE_STEP WHERE procedure_id = $id);

如何对它们进行排序,以便每个子步骤在其父步骤下按顺序放置在返回数组中?我将把返回数组作为json编码数组发送到视图中,如果这有所不同。

1 个答案:

答案 0 :(得分:2)

你可能想做类似的事情:

SELECT s.id, s.substep_of AS parent
FROM STEP s, PROCEDURE_STEP ps
WHERE ps.step_id = s.id
AND ps.procedure_id = $id;

这将为您提供一个步骤列表,每个步骤包含一个id和一个父ID。从这里,你可以递归地构建一个树:)...

function get_children_of( $id, $steps ) {
    $children = array();

    foreach( $steps as $step )
        if( $step->parent == $id ) 
            $children[$step->id] = get_children_of( $step->id, $steps );

    // Make it null... so we don't have deal with empty arrays
    if( empty( $children ) ) $children = null; 

    return $children;            
}

$steps = run_crazy_mysql_query();
$tree = get_children_of( 0, $steps );

这会给你一棵看起来像的树:

0 => array(
    1 => null,
    2 => array(
        3 => null,
        4 => null
    )
)

这应该会为您提供一些相对容易的工作方式,以生成HTML步骤列表。