PHP使用不同的排序字段创建数组

PHP使用不同的排序字段创建数组,php,sorting,Php,Sorting,首先感谢stackoverflow提供了这个平台,感谢您,给新手一个帮助- 现在。。 我有两个表格:页面和部分 每个人都有自己的id。 一个页面有一个或多个部分。 一个部分正好属于一页。 两个id的列表序列在不同的字段中处理 我读取了这两个表并创建了一个未排序的数组。 我最后需要的是一个如下所示的排序列表,使页面id和节id的顺序正确 以下是检索数据后我的tarray示例: myArr[] = array( page_id=>2, section_id=>2, parent_id

首先感谢stackoverflow提供了这个平台,感谢您,给新手一个帮助-

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

我读取了这两个表并创建了一个未排序的数组。 我最后需要的是一个如下所示的排序列表,使页面id和节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是页面中该节的序列。 页面顺序是同一父级的级别内的页面序列。 我在这里已经找到了一些rekursive循环的例子,但是——老实说——我无法使它们适应我的需要。还有,我需要一个回退循环吗

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

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

所以我需要的是:

阅读第1页,级别为0,页面顺序=1 阅读第2页,第1级-如果存在-第1页为父页,第_seq=1页 阅读第3页的第2级-如果存在-第2页为父页,第_seq=1页 ... 只要不存在更深层次,就继续 阅读第二页第4页,第二页为第2级-如果存在-第2页为父级,第_seq=1页 ... 只要不再存在更深层次的页面,并且此级别上不再有以第2页为父级的页面,则继续 阅读第二页第5页,第1级-如果存在-第1页为父页,第_seq=1页 ... 只要不再存在更深层次的页面,并且此级别上不再有以第5页为父级的页面,则继续 阅读第二页第6页,第0级,第2页 等等 有什么有力的帮助和想法吗

提前谢谢
Wolfgang

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

因此,我终于找到了一个解决方案

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创建要处理的所有部分的列表。它采用上面页面列表中生成的键,并使用节排序序列对其进行增强,然后根据节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.对分区列表进行排序 natsort$sectionSortList

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

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

最有可能的是,步骤1和步骤2可以在一个步骤中使用联接和适当的排序方式完成

节省最后一点的瘾君子会找到很多地方进行代码优化和缩减。 但是,我喜欢使用:和endif-


如果有人认为有可能使事情变得更快,欢迎提供您的想法

我很难理解这个问题。是否要按页面标题排序?如果是这样,就使用升序字母排序。我很难看到您在示例中实际按什么排序。如果我在填充后检查原始数组,那么它将按页面id排序。正如我上面所写的,我不能使用页面标题,因为它是自由文本并且包含任何内容。在这里它只是用来显示我想要的。顺便说一句,我已经更新了上面的数组来显示读取数据后的数组序列。是的,但是。。。让我们逐级排序,第页,第节。我得到了:PageID/SectionID=2/2,2/9,3/3,4/4,5/5,6/6,7/7,8/8,9/10,9/11,10/12,但我需要的是:PageID/SectionID=2/9,2/2,3/3,10/12,9/10,9/11,6/6,5,4/4,7,8我已经更新了原始问题,并逐步解释了阅读要求。我已经阅读了你添加的项目清单。我知道第一个项目代表第1页,第二个项目代表第2页。我看到了第二个项目符号表示的页面如何将第一个项目符号表示的页面作为父页面。但是,第三个项目符号表示的页面如何将第1页作为父级?在树状结构中,您希望它将第二个项目符号表示的页面作为父页面。请记住,不幸的是,项目符号中提到的id在真实生活中不是完美有序的。。。。