首先,感谢堆栈溢出提供这个平台和您,给一个新手一个帮助;-)
现在..。我有两个表:页和节都有自己的id。一个页面有一个或多个部分。一个部分正好属于1页。两个id的列表序列在不同的字段中处理。
我读取了两个表并创建了一个(未排序的)数组。我最后需要的是一个排序列表,如下所示,将page_id和节_id按正确的顺序排列。
这里有一个检索数据后的污点示例:
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_id,因为它在所有页面上都是唯一的?如何做正确的排序?
请注意:不幸的是,页面标题不能像上面的例子那样用于排序;-)因为它是自由文本.
所以我需要的是:
有什么有力的帮助和想法吗?
预先谢谢沃尔夫冈
发布于 2013-02-03 23:43:06
我的想法是使用数据库进行排序。使用MySQL,您可以在两个表上使用左联接来获取一个结果表中的节和页数据。在查询中,可以使用ORDER关键字指定必须对结果排序的列。
发布于 2013-02-10 21:54:36
所以我终于找到了一个解决办法
1)创建要处理的所有页面的列表。$key生成的外观在第一级(如"1“)、在第2层(如"1.1”)、在第3层(如"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)创建要处理的所有区段的列表。该方法以页面列表中生成的密钥为例,用节排序序列对其进行增强,并将其按section_id保存为密钥。
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)分段列表排序( $sectionSortList );
4)通过在$sectionSortList上循环生成结果,并获取section_id作为该列表中的键所必需的数据。
在有人问之前:当然,所有可能的过滤器都是在SQL中完成的。但有些是不可能的,因为需要在一个循环中完成-
最有可能的是,步骤1)和步骤2)可以在一个步骤中使用一个联接和一个适当的顺序来完成。
最后一位-节省-呆子将发现许多地方的代码优化和减少。但是,我喜欢与:和endif;;-)的替代功能。)
如果有人看到了让事情变得更快的可能性,欢迎你提供你的想法。
https://stackoverflow.com/questions/14676679
复制相似问题