1

首先感谢stackoverflow提供这个平台和你,给新手一个帮助;-)

现在..我有 2 个表:页面和部分每个都有自己的 id。一页有一个或多个部分。一个部分恰好属于 1 页。两个 id 的列表序列在不同的字段中处理。

我读取了两个表并创建了一个(未排序的)数组。我最终需要的是一个排序列表,如下所示,page_id 和 section_id 的顺序正确。

这是检索数据后我的 tarray 的示例:

myArr[] = array( page_id=>2,  section_id=>2,  parent_id=>0, level=>0, page_seq=>1, section_seq=>2, page_title=>p1 );
myArr[] = array( page_id=>2,  section_id=>9,  parent_id=>0, level=>0, page_seq=>1, section_seq=>1, page_title=>p1 );
myArr[] = array( page_id=>3,  section_id=>3,  parent_id=>0, level=>0, page_seq=>2, section_seq=>1, page_title=>p2 );
myArr[] = array( page_id=>4,  section_id=>4,  parent_id=>0, level=>0, page_seq=>3, section_seq=>1, page_title=>p3 );
myArr[] = array( page_id=>5,  section_id=>5,  parent_id=>3, level=>1, page_seq=>3, section_seq=>1, page_title=>p2-3 );
myArr[] = array( page_id=>6,  section_id=>6,  parent_id=>3, level=>1, page_seq=>2, section_seq=>1, page_title=>p2-2 );
myArr[] = array( page_id=>7,  section_id=>7,  parent_id=>4, level=>1, page_seq=>1, section_seq=>1, page_title=>p3-1 );
myArr[] = array( page_id=>8,  section_id=>8,  parent_id=>7, level=>2, page_seq=>1, section_seq=>1, page_title=>p3-1-1 );
myArr[] = array( page_id=>9,  section_id=>10, parent_id=>5, level=>2, page_seq=>1, section_seq=>1, page_title=>p2-1-1 );
myArr[] = array( page_id=>9,  section_id=>11, parent_id=>5, level=>2, page_seq=>1, section_seq=>2, page_title=>p2-1-1 );
myArr[] = array( page_id=>10, section_id=>12, parent_id=>3, level=>1, page_seq=>1, section_seq=>1, page_title=>p2-1 );

我的问题是排序。

  • section_seq 是页面内部分的序列。
  • page_seq 是同一父级的级别内的页面序列。

我已经在这里找到了一些递归循环示例,但是 - 老实说 - 我无法根据我的需要调整它们。而且,我需要一个递归循环吗?

我的数组的键应该是什么:section_id,因为它在所有页面中都是唯一的?如何进行正确的排序?

需要注意的是:页面标题很遗憾不能用于排序目的 - 如上例所示 - )因为它是自由文本......

所以我需要的是:

  • 读取级别为 0 且 page_seq = 1 的第一页 (1)
  • 读取具有级别 1 的第一页 (2) - 如果存在 - 以页面 (1) 作为父页面且 page_seq = 1
  • 读取具有级别 2 的第一页 (3) - 如果存在 - 以页面 (2) 作为父页面且 page_seq = 1
  • ...只要不存在更深层次就继续
  • 读取具有级别 2 的第二页 (4) - 如果存在 - 以页面 (2) 作为父级且 page_seq = 1
  • ...只要不存在更深层次并且此级别上没有更多页面以页面 (2) 作为父级,就继续
  • 读取具有级别 1 的第二页 (5) - 如果存在 - 页面 (1) 作为父级且 page_seq = 1
  • ...只要不存在更深层次并且此级别上没有更多页面以第 (5) 页为父级,则继续
  • 读取级别为 0 且 page_seq = 2 的第二页 (6)
  • 等等。

任何强大的帮助和想法?

在此先感谢沃尔夫冈

4

2 回答 2

0

所以最后我找到了解决方案

1)创建要处理的所有页面的列表。$key 生成的第一层看起来像“1”,第二层像“1.1”,第三层像“1.1.1”等。

read all pages
while ( $fetch_obj_pages = $obj_pages->fetchRow() ):
    // do some validations and keep only those in mind which should be processed
    ....

    // get and save key for sorting
    if ( $isValid == TRUE ):
        $key = '';
        if ( array_key_exists ( $fetch_obj_pages[ 'parent_id' ],  $pageSortList ) == TRUE ):
            $key = $pageSortList[ $fetch_obj_pages[ 'parent_id' ]] . '.';
        endif;
        $key .= $fetch_obj_pages[ 'page_seq' ];
        $pageSortList[ $fetch_obj_pages[ 'page_id' ]] = $key;
     endif;
endwhile;

2) 创建所有要处理的部分的列表。它取上面 pages 列表中生成的 key 并通过 section 排序顺序对其进行增强,然后将其保存为每个 section_id 作为 key。

read all sections
while ( $fetch_obj_sections = $obj_sections->fetchRow() ):
    // do some validations and keep only those in mind which should be processed
    ....

    // get and save key for sorting
    if ( $isValid == TRUE ):
        // get key from page and save key for section
        $key = '';
        if ( array_key_exists ( $fetch_obj_sections[ 'page_id' ],  $pageSortList ) == TRUE ):
            $key = $pageSortList[ $fetch_obj_sections[ 'page_id' ]] . '-';
        endif;
        $key .= $fetch_obj_sections[ section_seq ];
        $sectionSortList[ $fetch_obj_sections[ 'section_id' ]] = $key;
    endif;
endwhile;

3) 对节列表 natsort ( $sectionSortList ) 进行排序;

4) 通过循环 $sectionSortList 并获取必要的数据来构建结果,因为 section_id 用作此列表中的键。

在有人问之前:当然,所有可能的过滤器都是在 SQL 中完成的。但有些是不可能的,因为需要循环完成——

最有可能的是,步骤 1) 和 2) 可以使用 JOIN 和适当的 ORDER BY 一步完成。

Last-Bit-Saving-Junkies 将找到很多代码优化和减少的地方。但是,我喜欢 : 和 endif; 的替代功能;;-)

如果有人看到让事情变得更快的可能性,欢迎提供您的想法。

于 2013-02-10T21:54:36.363 回答
0

我的想法是使用数据库进行排序。使用 MySQL,您可以在两个表上使用左连接来获取一个结果表中的部分和页面数据。在查询中,您可以使用 ORDER BY 关键字来指定必须对结果进行排序的列。

于 2013-02-03T23:43:06.883 回答