2017-01-26 23 views
3

私のアプリケーションが動作するデータ構造を作成しようとしていますので、カテゴリをシステムのwooコマース構造にマップできます。カテゴリの完全なパスを持つカテゴリ階層(下に示す)が必要です。カテゴリの子ノードのIDを持つ各親/子の間にパイプがあります。woocommerce api製品/カテゴリからカテゴリの階層を作成する

私は簡単に次のようにwoocommerce内のすべての製品カテゴリを取得することができます:$ return_woo_categoriesの

$woocommerce = new Client($this->ecommerce_url,$this->ecommerce_api_key,$this->ecommerce_api_cred,array('wp_api' => true,'version' => 'wc/v1')); 

    $send_call = true; 
    $per_page = 30; 
    $categories = array(); 
    $page = 1; 

    $categories = array(); 

    while($send_call == true) 
    { 

     $result_categories = $woocommerce->get('products/categories', array('per_page'=>$per_page, 'page'=>$page,'context' => 'view')); 
     $page++; 
     $categories = array_merge($categories, $result_categories); 

     if(count($result_categories) < $per_page) 
     { 
      $send_call=false; 
     } 

    } 

    $return_woo_categories = array(); 

    foreach($categories as $index => $category) 
    { 
     $return_woo_categories[] = array('name' => $category['name'], 'id' => $category['id'], 'parent' => $category['parent']); 
    } 

のvar_dump

array(13) { 
    [0]=> 
    array(3) { 
    ["name"]=> 
    string(1) "/" 
    ["id"]=> 
    int(23) 
    ["parent"]=> 
    int(20) 
    } 
    [1]=> 
    array(3) { 
    ["name"]=> 
    string(1) "+" 
    ["id"]=> 
    int(21) 
    ["parent"]=> 
    int(20) 
    } 
    [2]=> 
    array(3) { 
    ["name"]=> 
    string(6) "Albums" 
    ["id"]=> 
    int(20) 
    ["parent"]=> 
    int(16) 
    } 
    [3]=> 
    array(3) { 
    ["name"]=> 
    string(18) "Castle On The Hill" 
    ["id"]=> 
    int(24) 
    ["parent"]=> 
    int(23) 
    } 
    [4]=> 
    array(3) { 
    ["name"]=> 
    string(8) "Clothing" 
    ["id"]=> 
    int(14) 
    ["parent"]=> 
    int(0) 
    } 
    [5]=> 
    array(3) { 
    ["name"]=> 
    string(7) "Hoodies" 
    ["id"]=> 
    int(15) 
    ["parent"]=> 
    int(14) 
    } 
    [6]=> 
    array(3) { 
    ["name"]=> 
    string(5) "Music" 
    ["id"]=> 
    int(16) 
    ["parent"]=> 
    int(0) 
    } 
    [7]=> 
    array(3) { 
    ["name"]=> 
    string(10) "My New Cat" 
    ["id"]=> 
    int(6) 
    ["parent"]=> 
    int(0) 
    } 
    [8]=> 
    array(3) { 
    ["name"]=> 
    string(7) "Posters" 
    ["id"]=> 
    int(17) 
    ["parent"]=> 
    int(0) 
    } 
    [9]=> 
    array(3) { 
    ["name"]=> 
    string(12) "Shape of You" 
    ["id"]=> 
    int(25) 
    ["parent"]=> 
    int(23) 
    } 
    [10]=> 
    array(3) { 
    ["name"]=> 
    string(7) "Singles" 
    ["id"]=> 
    int(18) 
    ["parent"]=> 
    int(16) 
    } 
    [11]=> 
    array(3) { 
    ["name"]=> 
    string(8) "T-shirts" 
    ["id"]=> 
    int(19) 
    ["parent"]=> 
    int(14) 
    } 
    [12]=> 
    array(3) { 
    ["name"]=> 
    string(1) "x" 
    ["id"]=> 
    int(22) 
    ["parent"]=> 
    int(20) 
    } 

私は出力として、次のことをデータ構造を必要とします。 (キーの順序は関係ありません)。

$cat_map = array(
    'Clothing' => 14, 
    'Clothing|Hoodies' => 15, 
    'Clothing|T-shirts' => 19, 
    'My New Cat' => 6, 
    'Posters' => 17, 
    'Music' => 16, 
    'Music|Singles' => 18, 
    'Music|Albums' => 20, 
    'Music|Albums|x' => 22, 
    'Music|Albums|/' => 23, 
    'Music|Albums|+' => 21, 
    'Music|Albums|/|Castle On The Hill' => 24, 
    'Music|Albums|/|Shape Of You' => 25, 
); 

私はこれを行う方法に固執しています。私は再帰が必要だと思うだろう。私が立ち往生しているものは、私が商業から戻ってくる配列の順序はどんな種類の階層構造でもありません。 (私は最新の最初に追加したときの順序)

答えて

0

私は親カテゴリ

  • は、子カテゴリ
  • は子供連れの子供をゲット取得

    1. を取得するために3レベルループを行うだろうカテゴリ

    ループごとに連結します。"|"を入力し、キー=>値を各 レベルに追加します。

    次のコード予想アレイ

    //////////////////////////////////////////////////// 
    //creating new array to store new structure 
    $cat_map = [] ; 
    //3 level loop to get desired info 
    foreach($return_woo_categories as $inf){ 
    //1 loop to get parent categories 
        if($inf['parent'] == 0){ 
          $parentcategoryname = $inf['name'];   
          $cat_map[$parentcategoryname] = $inf['id'];   
          //2 loop to get 1 child category 
           foreach($return_woo_categories as $inf2){ 
            if($inf['id'] == $inf2['parent']){ 
            //concat first level and second level name    
            $firstchildname = $inf['name']."|".$inf2['name']; 
             $cat_map[$firstchildname] = $inf2['id'];     
    
            //3 loop to get 2 child category 
            foreach($return_woo_categories as $inf3){ 
    
             if($inf2['id'] == $inf3['parent']){ 
    
             $secondchildname = $inf['name']."|".$inf2['name']."|".$inf3['name']; 
              $cat_map[$secondchildname] = $inf3['id'];  
    
             } 
            } 
            }    
           }   
         } 
    } 
    //Result 
    var_dump($cat_map); 
    array (size=11) 
        'Clothing' => int 14 
        'Clothing|Hoodies' => int 15 
        'Clothing|T-shirts' => int 19 
        'Music' => int 16 
        'Music|Albums' => int 20 
        'Music|Albums|/' => int 23 
        'Music|Albums|+' => int 21 
        'Music|Albums|x' => int 22 
        'Music|Singles' => int 18 
        'My New Cat' => int 6 
        'Posters' => int 17 
    
  • 1

    が最も簡単な方法は、最初のツリー(ネストされた)構造を構築し、次に文字列を連結するために再帰関数を使用するであろう提供する:

    $tree = array(); 
    foreach ($return_woo_categories as $cat) { 
        if (!isset($tree[$cat['id']])) { $tree[$cat['id']] = array(); } 
        $tree[$cat['id']]['name'] = $cat['name']; 
        if (!isset($tree[$cat['parent']])) { $tree[$cat['parent']] = array(); } 
        $tree[$cat['parent']]['children'][$cat['id']] =& $tree[$cat['id']]; 
    } 
    
    function buildPaths($tree, $path = '') { 
        $result = array(); 
        foreach ($tree as $id => $cat) { 
         $result[$id] = $path . $cat['name']; 
         if (isset($cat['children'])) { 
          $result += buildPaths($cat['children'], $result[$id] . '|'); 
         } 
        } 
        return $result; 
    } 
    
    $cat_map = buildPaths($tree[0]['children']); 
    

    この$cat_map[id] => 'path'構造を持っていますので、必要な結果に合わせて反転する必要があります。 idを使用してパスにアクセスする方が、逆の場合よりも便利ですが、実際にこの構造が必要な場合は、最後の行は次のようになります。

    $cat_map = array_flip(buildPaths($tree[0]['children'])); 
    
    関連する問題