2013-02-03 24 views
1

首先感謝陣列計算器提供這種plattform和你,給一個新手幫助;-)PHP創建具有不同排序字段

現在.. 我有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是相同的父級別內的頁的順序。

我在這裏已經找到了一些rekursive循環的例子,但是 - 說實話 - 我無法使它們適應我的需求。而且,我需要一個rekursive循環嗎?

應該是什麼我數組的鍵:SECTION_ID,因爲它是所有網頁獨特之處? 如何做正確的排序?

只是要注意的是:在網頁標題可以遺憾的是沒有使用 - 上面的例子 - 用於排序目的;-),因爲它是免費的文字...

所以我需要的是:

  • 讀出的第一頁(1)用0級和page_seq = 1
  • 讀出的第一頁(2),其具有水平1 -if exists-配頁(1)作爲親和page_seq = 1
  • 讀出的第一具有級別2的頁面(3) - 如果存在 - 以頁面(2)爲父級,並且page_seq = 1
  • ...繼續只要沒有更多的更深層次的存在
  • 讀取的第二頁(4),其具有水平2 -if exists-與頁面(2)作爲親和page_seq = 1
  • ...繼續如只要沒有更多的更深層次的存在,也可以作爲親本具有水平頁面(2)上沒有更多頁
  • 讀取的第二頁(5),其具有水平1 -if exists-配頁(1)作爲親和page_seq = 1
  • ...只要沒有更深的級別存在並且在該級別上沒有頁面(5)作爲父級,則不再有更多頁面
  • 閱讀第二頁(6),級別0和page_seq = 2
  • 等。

任何強大的幫助&想法?

在此先感謝 沃爾夫岡

+0

我很難理解這個問題。你想按page_title排序嗎?如果是這樣,只需使用升序字母排序。 – erisco

+0

我很難看到你在實例中實際排序的內容。 – MatsLindh

+0

如果我在填充原始數組後檢查原始數組,那麼它將按page_id排序。 正如我上面寫的,我不能使用頁面標題,因爲它是自由文本幷包含任何內容。它只是用來顯示我想要的東西。 – user2037828

回答

0

我的想法是使用數據庫來進行排序。使用MySQL,您可以在兩個表上使用左連接來獲取一個結果表中的部分和頁面數據。在查詢中,您可以使用ORDER BY關鍵字來指定結果必須根據其進行排序的列。

+0

是的,但... 讓我們按等級,page_seq,section_seq進行訂購。 我得到: page id/section_id = 2/2,2/9,3/3,4/4,5/5,6/6,7/7,8/8,9/10,9/11 ,10/12 但我需要的是: page_id/section_id = 2/9,2/2,3/3,10/12,9/10,9/11,6/6,5/5, 4/4,7/7,8/8 – user2037828

+0

我已經逐步解釋了閱讀需求,更新了原點問題。 – user2037828

+0

我已閱讀您添加的子彈列表。我瞭解第一個項目符號代表第一頁,第二個項目符號代表第二頁。我看到第二個項目符號代表的頁面如何將第一個項目符號所代表的頁面作爲父頁面。但是,第三個項目符號表示的頁面如何將頁面1作爲父項?在樹結構中,您會期望它將第二個項目符號所表示的頁面作爲父頁面。 –

0

所以最後我找到了解決辦法

1)創建所有頁面的列表是過程。在$密鑰生成看起來一級,如「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)第三級創建的所有部分處理的列表。它採用上面的頁面列表中生成的關鍵字,並使用截面排序順序對其進行增強,然後將其按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)排序節列表 natsort($ sectionSortList);

4)通過在$ sectionSortList上循環來獲得結果,並獲取由於在該列表中用作鍵的section_id而需要的數據。

之前有人問:當然,所有可能的過濾器都是在SQL中完成的。但有些是不可能的,並且由於需要在循環中完成 - 最有可能的是,步驟1)和2)可以使用JOIN和適當的ORDER BY在一個步驟中完成。

Last-Bit-Saving-Junkies會爲代碼優化和縮減找到很多地方。但是,我喜歡使用以下替代功能:and endif; ;-)

如果有人看到有可能使事情變得更快,歡迎提供您的想法。