2011-07-28 72 views
3

正在嘗試將我的wordpress上的所有類別作爲類型類別的對象的多維數組對象。 在wordpress中有2種功能可以做我想做的,但不完全是:PHP wordpress獲取類別對象的多維數組

1)get_categories() - 這個返回一個類別對象數組,這很棒,但是這個數組是一個平面其一,哪一類是父母或哪一類是兒童,不存在差異。

2)wp_list_categories() - 它可以返回herarchy完整的類別,但問題是返回值是html,我需要類別仍然是對象。

舉例來說,如果我有以下3種樹木作爲我的家長少類別:

/* 
tree_stump 

tree1 
    branch1 

tree2 
    branch2 
     twig2 
      leaves2 
      flowers2 
      fruits2 
*/ 

我試圖讓這可能是這樣的返回值:

$cat_tree=array(1=>$tree_stump,2=>array(1=>$tree1,2=>$branch1),3=>array(1=>$tree2,2=>array(1=>$branch2,2=>array($twig2,$leaves2,$flowers2,$fruits2 )))); 

哪裏多dim陣列的每個成員仍然是一個對象,在所有的子陣列中,第一個是其餘成員的父項。我想這會需要一些有點遞歸的東西 - 讓我不安的東西!

不知道我是否有意義,請讓我知道如果我需要更清楚.. 感謝您的閱讀。

回答

0

get_categories()返回一個包含許多可用於構建數組的屬性的數組。即$category->category_parent$category->parent

+0

感謝大衛,但我希望得到更多的幫助,特別是遞歸位。 – SIndhu

2

這就是我所做的: 首先使用get_categories()獲取數組。然後將其轉換爲新的陣列。 我假設所有的孩子都在原始數組中的父母之下。

$cats_tree = array(); 
foreach($categories as $category){ 
    $parent = $category->parent; 
    if ($parent && isset($cats_tree[$parent])){ 
     $cats_tree[$parent]->children[$category->cat_ID] = $category; 
    }else{    
     $cats_tree[$category->cat_ID] = $category; 
    } 
} 

希望這是仍然有人

+0

如果類別嵌套深度超過2級,則此方法將失敗。假設以下結構:parent [ID:1]> child [ID:2]> grandchild [ID:3]。它產生$ cats_tree [1] = WP_Term-> children [2] = WP_Term併產生$ cats_tree [3] = WP_Term; (對於僞代碼,很抱歉) – Arron

+0

第3級最終會出現在頂層。遞歸patrick64答案效果很好,雖然 – Arron

4

這裏有用的是我的版本,它假定$類是get_categories()的輸出,但它並不重要,他們在什麼樣的順序。

$cats_tree = get_cat_tree(0,$categories); 
function get_cat_tree($parent,$categories) { 
    $result = array(); 
    foreach($categories as $category){ 
     if ($parent == $category->category_parent) { 
      $category->children = get_cat_tree($category->cat_ID,$categories); 
      $result[] = $category; 
     } 
    } 
    return $result; 
} 
+1

我喜歡這使用遞歸。做得很好 – Arron

0
<?php 
$args = array(
    'taxonomy' => 'category', 
    'orderby' => 'name', 
    'order' => 'ASC', 
    'hierarchical' => true, 
    'hide_empty' => false, 
); 
$the_query = new WP_Term_Query($args); 
$categories = $the_query->get_terms();  

function get_cat_tree($parent,$categories) { 
    $result = array(); 
    foreach($categories as $category){ 
     if ($parent == $category->parent) { 
      $category->children = get_cat_tree($category->term_id,$categories); 
      $result[] = $category; 
     } 
    } 
    return $result; 
} 
$cats_tree = get_cat_tree(0,$categories);