2012-05-14 10 views
0

カテゴリツリー階層全体(ebay API)を取得し、データベース(mysql)を使用せずに各カテゴリ値を出力する必要があります。私はforeachとwhileを使用していくつかのアプローチを試しましたが、スクリプトはトップカテゴリの後に、または多くても最初の子カテゴリセットの後になくなります。ここでPHP foreach/while/loop - データベースなしでカテゴリ階層全体をトラバースする方法

は私のスクリプトです:私が言うことができるものから、

set_time_limit('0'); 
error_reporting(E_ALL); 
## get categories allow us to traverse through categories 

//getcategorycall call to return the categories based on the category id 
function GetCategoryInfo($id) { 
    $URL = "api.example.com"; 
    $response = json_decode(file_get_contents($URL), true); 
    //check if the request is returned with success 
    $Ack = $response['Ack']; 
    if ($Ack !== 'Success') { 
     echo "error $Ack"; 
     exit(); 
    } 
    //get category array 
    $CategoryArray = $response['CategoryArray']['Category']; 
    return $CategoryArray; 
} 

$CategoryID_top = '-1'; 
$CategoryInfo = GetCategoryInfo($CategoryID); 

//traverse top categories 
//we need to count the categories and start from 1 due the fact the requested category(e.g. root) is included in the response 
$top_count = count($CategoryInfo); 
$top_i = 1; 
while ($top_i <= $top_count) { 
    $Category = $CategoryInfo[$top_i]; 
    # print_r($Category); 
    # exit(); 
    $CategoryID = $Category['CategoryID']; 
    $CategoryName = $Category['CategoryName']; 
    $LeafCategory = $Category['LeafCategory']; 
    echo " Top category:: $CategoryID\n $CategoryName\n $LeafCategory\n<br>"; 

    //traverse child categories that are not leaf until it reaches the leaf categories 
    if (empty($LeafCategory)) { 
     echo "this is not a leaf category"; 
     $CategoryInfo = GetCategoryInfo($CategoryID); 

     $child_count = count($CategoryInfo); 
     $child_i = 1; 
     while ($child_i <= $child_count) { 
      $Category = $CategoryInfo[$child_i]; 
      $CategoryID = $Category['CategoryID']; 
      $CategoryName = $Category['CategoryName']; 
      $LeafCategory = $Category['LeafCategory']; 
      echo " Child category :: $CategoryID\n $CategoryName\n $LeafCategory\n<br>"; 
      $child_i++; 
     } 
    } 
    $top_i++; 
} 
+2

あなたは** **コードをフォーマットしていただけますか? –

+0

@jcinacioそれは私によく見える...それをフォーマットする方法?実際には – themihai

+0

、しました。 –

答えて

0
  1. 、あなたの内側のループで$ CategoryInfo変数を交換する(代わりに別の名前を選択)してはならない、それがあるとして、おそらく物事を台無しにする。

  2. 多すぎるデータを取得している可能性があります。時間がかかりすぎて、スクリプトが定義済みの制限で停止する可能性があります。 set_time_limit()関数を使用して上限をより高い値に設定します(数分など)。

また、物事を簡単にするために、次のコード:

$top_count = count($CategoryInfo); 
$top_i = 1; 
while ($top_i <= $top_count) { 
    $Category = $CategoryInfo[$top_i]; 
    ... 
    $top_i++; 
} 

を置き換えることができる:

foreach ($CategoryInfo as $Category) { 
    ... 
} 
+0

@ foreachを使うと、jsonの結果(array-> 0)の最初のカテゴリは実際には要求されたカテゴリなので、いくつかの "複製"が作成されます。それが私が使っていた理由です。問題は、私が子供のカテゴリの子供たちを得る方法を知らないということです。あなたが見ると、スクリプトのロジックにはトップのカテゴリが得られ、次にそれぞれのトップのカテゴリの子供が不具合になり、次のレベルの子供のカテゴリ(葉ではない)からやり直す。 – themihai

+0

'array_shift()'を使って最初のものを削除することができます。また、whileループの '<='は、配列の最後を過ぎた1つの要素にアクセスしようとします。 –

+0

カテゴリが再帰的(N個のネストされたレベル)である場合は、それらをリストする再帰関数が必要です –

関連する問題