1

まず第一に、このプラットフォームを提供してくれたstackoverflowと、初心者を助けてくれたあなたに感謝します;-)

今..私は2つのテーブルを持っています:ページとセクションそれぞれが独自のIDを持っています。ページには 1 つ以上のセクションがあります。セクションはちょうど 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 (存在する場合) を持つ 2 番目のページ (4) を読み取り、ページ (2) を親として、page_seq = 1
  • ... より深いレベルが存在せず、このレベルにページ (2) を親として持つページがなくなるまで続行します
  • レベル 1 の 2 番目のページ (5) を読み取り (存在する場合)、ページ (1) を親として、page_seq = 1
  • ... より深いレベルが存在せず、このレベルにページ (5) を親として持つページがない限り続行します
  • レベル 0 および page_seq = 2 で 2 番目のページ (6) を読み取る
  • 等々。

強力なヘルプとアイデアはありますか?

前もってありがとうヴォルフガング

4

2 に答える 2

0

私の考えは、データベースを使用して並べ替えを行うことです。MySQLを使用すると、両方のテーブルで左結合を使用して、1つの結果テーブルのセクションとページのデータを取得できます。クエリでは、ORDER BYキーワードを使用して、結果を並べ替える必要のある列を指定できます。

于 2013-02-03T23:43:06.883 に答える
0

だから最終的に私は解決策を見つけました

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) セクション リストの並べ替え natsort ( $sectionSortList );

4) $sectionSortList をループして結果を作成し、このリストでキーとして使用される section_id により必要なデータを取得します。

誰かが尋ねる前に: もちろん、考えられるすべてのフィルターは SQL で実行されます。しかし、いくつかは不可能であり、ループで実行する必要があるためです-

おそらく、ステップ 1) と 2) は、JOIN と適切な ORDER BY を使用して 1 つのステップで実行できます。

Last-Bit-Saving-Junkies は、コードの最適化と削減のための多くの場所を見つけるでしょう。ただし、: と endif; を使用した代替機能が気に入っています。;-)

誰かが物事を本当に速くする可能性を見つけた場合は、あなたのアイデアを提供してください。

于 2013-02-10T21:54:36.363 に答える