2017-05-31 10 views
3

私はページカテゴリ(チェックボックスとして表されています)にあります。次のページには、第1ページのカテゴリのサブカテゴリがあります。第2ページの要素の次のページのサブカテゴリなど。選択したすべてのアイテムを、異なるレベルで作られた選択肢を表す配列に保存します。問題は、これらの配列すべてからツリー構造を作成する方法がわかりません。PHPは4つの配列からツリー構造の配列を作成します

私は4つの配列を持っています(それぞれのレベルは#ページで選択されたチェックボックスを表しています)。ユーザーが選択したチェックボックスを保持します。ここでデータの例である:(値は、データベース内のアイテムのIDを表している)IDごとに

The l1 value of $_SESSION['0'] is '1' 

The l2 value of $_SESSION['0'] is '2' 
The l2 value of $_SESSION['1'] is '3' 

The l3 value of $_SESSION['0'] is '3' 
The l3 value of $_SESSION['1'] is '4' 
The l3 value of $_SESSION['2'] is '5' 
The l3 value of $_SESSION['3'] is '6' 

The l4 value of $_SESSION['0'] is '1' 
The l4 value of $_SESSION['1'] is '2' 
The l4 value of $_SESSION['2'] is '3' 
The l4 value of $_SESSION['3'] is '4' 
The l4 value of $_SESSION['4'] is '5' 

私はそれがために、例えば(に属するアイテムのIDを持っているデータベースに:レベル2: )

id=1; name = programming, category_id = 1; 

データベースを照会することによって関係を見つけることができます。

上記の場合、l2の両方の要素はl1 [0]のサブカテゴリです。 レベル3の最初の2つの要素はl2 [0]のサブカテゴリであり、最後の2つの要素はl2 [1]のサブカテゴリであり、レベル4ではそれらのうちのいくつかはレベル3のスムースのサブカテゴリです(すべての要素がサブカテゴリを持つわけではありません)。

このデータすべてに対してツリー構造のJSONを作成するにはどうすればよいですか?任意のアイデアや提案ですか?ありがとうございました!

+0

この質問はJSONとは関係ありません。ネイティブのPHPデータ構造(配列、オブジェクト)で "ツリー構造"を作成したい場合、JSONバージョンをシリアル化するにはJSON_encodeを使用します。 – JAAulde

+0

O知っているが、問題は私がドンではない、木構造をする方法を知っている –

+0

私はそれを理解しています。私の主張は、JSONについて話し続け、JSONとしてタグ付けされた質問があることです。あなたが良い助けを求めたいのであれば、あなたの質問は本当の問題に集中してください。 – JAAulde

答えて

1

まず、ご迷惑をおかけして申し訳ございませんが、ご容赦ください。

私はあなたの問題、私はそれを理解する方法を説明してみましょう:

最初のページを

あなたが名前「カテゴリ」でチェックボックスが含まれており、値が特定のメインカテゴリ

のIDでフォームを表示します2ページ目の着陸で

あなたは、配列を移入(私はそれを呼ぶだろう$ _SESSION [ 'categories_checked'] )2ページ目でチェックカテゴリ

あなたがレベル1は、メインページ上のカテゴリを表示するのと同じ方法のサブカテゴリを表示します。第三に、チェックのサブカテゴリ

で(私は$ _SESSION [「subcats1_checked」]、それを呼ぶだろう)あなたは、配列を移入3ページ目の着陸

のは、フォーム要素名は「subcat1」であるとしましょうページ

メインページにカテゴリを表示するのと同じ方法で、レベル2のサブカテゴリを表示します。のは、フォーム要素名は、チェックのサブカテゴリ第四に

と4ページ目の着陸で「subcat2」

あなたは、配列を移入

は(私はそれを呼ぶだろう$ _SESSION [「subcats2_checked」])としましょうページ

メインページにカテゴリを表示するのと同じ方法で、レベル3のサブカテゴリを表示します。のは、フォーム要素名は、チェックのサブカテゴリと最後のページの着陸で "subcat3"

あなたは、配列を移入

は(私はそれを呼ぶだろう$ _SESSION [ 'subcats3_checked'])としましょう

マイ私の視点から

に答えて、私はむしろ、次の操作を行います。

  • 常に同じ変数名(HTMLフォームおよびPHPで)を使用するようにコードが大幅
  • を向上させることができoptionnalyレベル
  • 巣あなたのアレイ

    $_SESSION['categories'] = [ 
         3 => [ 
          56 => [ 
           89 => [ 
             121 => [1,2,3,4,5,], 
             ], 
            ], 
          ], 
    ]; 
    
  • を含むであろう隠しフォーム要素を使用

この表現は現実に近いと思われ、表示しやすくする必要があります。

次のステップでは、1ステップ形式の結果の配列と$ _SESSION ['categories']変数を渡す再帰関数を作成します。

ソリューションがあなたにとって正しい方法であるかどうかを教えてください。必要に応じて手を差し上げることができます。

だから、再帰が成功の鍵ですが...

何かが欠落している...あなたの結果を扱い、私はmentionned PHPの配列を持つために、あなたはそのように、あなたのフォームを構築する必要があります:

最初のページ

<input type="checkbox" name="category[0]" value="1" /> Cat1 name 
<input type="checkbox" name="category[0]" value="2" /> Cat2 name 

2ページ目

Subcats of cat 1 
<input type="checkbox" name="category[1]" value="110" /> SubCat1 name 
<input type="checkbox" name="category[1]" value="222" /> SubCat2 name 

Subcats of cat 2 
<input type="checkbox" name="category[2]" value="110" /> SubCat1 name 
<input type="checkbox" name="category[2]" value="222" /> SubCat2 name 

このようにして、サブカテゴリがその親によってのみ定義されるため、レベル入力要素を避けることができます。 もちろん、これはすべてのカテゴリとサブカテゴリが異なるIDを持つことを意味します(そうでない場合はトリックが可能です)。ここで

は、スクリプト全体をスキャンする必要がありますので、これは明らかにデータを扱うための最適化された方法ではありません

注意してください、あなたに

<?php 
/** 
* Created by PhpStorm. 
* User: dvienne 
* Date: 31/05/2017 
* Time: 15:16 
*/ 
function treatCategories($parentCatId, $selectedId, $categories) { 
    foreach($categories as $categoryID => $category) { 
    if(empty($category) AND ($categoryID==$parentCatId)) { 
     $categories[$categoryID][$selectedId] = []; 
     break; 
    } elseif(is_array($category) AND empty($category)) { 
     /** RECURSION */ 
     treatCategories($parentCatId, $selectedId, $category); 
    } 
    } 

    $_SESSION['categories'] = $categories; 
} 


$userSelection = $_POST['categories']; 
$level   = $_POST['level']; 
if(!empty($_SESSION['categories'])) { 
    $categories = $_SESSION['categories']; 
} else { 
    $categories = []; 
} 

if(!empty($categories)) { 
    foreach($userSelection as $parentCatId => $selectedId) { 
    treatCategories($parentCatId, $selectedId, $categories); 
    } 
} else { 
    foreach($userSelection as $catId) { 
    $categories[$catId] = []; 
    } 

    $_SESSION['categories'] = $categories; 
} 

を助けるべきで迅速かつ汚いコードですカテゴリ配列の値を挿入します。 AJAXクエリを使用して1ページのソリューションを検討する必要があります。

+0

あなたはすべてを正しく理解しました!私は再帰関数を書く必要があることを知っていますが、それをどうやって行うのか分かりません。私は30または40アレイを構築する必要があります。私はこの質問を解決するための最適な方法を見ることができません –

+0

私はどこから始めるべきかわかりません。あなたがもっと明確になるために、表4のデータベースでは、私はrelationship_idをレベル3に持っています –

関連する問題