2012-06-18 75 views
1

這裏從CMS函數返回我的數據:PHP - 將數據轉換的平板陣列分層的多維數組

array (
0 => 
stdClass::__set_state(array(
'term_id' => '31', 
'parent' => '26' 
)), 
1 => 
stdClass::__set_state(array(
'term_id' => '3', 
'parent' => '0' 
)), 
2 => 
stdClass::__set_state(array(
'term_id' => '32', 
'parent' => '26' 
)), 
3 => 
stdClass::__set_state(array(
'term_id' => '33', 
'parent' => '26' 
)), 
4 => 
stdClass::__set_state(array(
'term_id' => '34', 
'parent' => '26' 
)), 
5 => 
stdClass::__set_state(array(
'term_id' => '26', 
'parent' => '3' 
)), 

我需要上述轉換爲以下格式:

Array 
(
[0] => Array 
    (
     3 
    ) 
[1] => Array 
    (
     26 
    ) 
[2] => Array 
    (
     31 
     32 
     33 
     34 
    ) 
) 

所以讓我解釋。源中的每個項目都是一個術語。每個學期有一個ID (term_id)和一個父母(parent)。如果父母== 0,它沒有父母,並且級別爲0.任何級別0的子項都是級別1,依此類推。

我想要返回的是一個數組,其中包含所有級別及其ID在該級別。

請注意,這只是示例數據,每個級別上可能會有更多級別和任意數量的ID。

所以使用PHP我該如何實現我所追求的?

回答

4

假設有效結構通過數據(沒有孤兒和這樣),可以循環和採摘每個下一級別,直到沒有更多的數據左:

$output = array(); 
$current = array(0); 
$index = 0; 

while (! empty($data)) { 
    $parents  = $current; 
    $current  = array(); 
    $output[$index] = array(); 

    foreach ($data as $key => $term) { 
     if (in_array($term->parent, $parents)) { 
      $output[$index][] = $term->term_id; 
      $current[]  = $term->term_id; 
      unset($data[$key]); 
     } 
    } 

    $index ++; 
} 

var_dump($output); 
0

我認爲你需要更多的數據。例如,父母= 26的對象在第2級。你現在怎麼做?你需要有另一個數組,你將擁有parent_id及其級別。然後你可以遍歷數組並構建你想要的東西。如果這是multidemnsional陣列可以使用array_walk_recursive

+2

_For例如與父對象= 26處第2級你怎麼現在?_通過確定哪個級別ID'26'首先,從那些有'0'開始。這在WordPress中是非常充足和典型的層次結構數據。 :) – Rarst

+0

他從來沒有提到它是WordPress的。 – Zefiryn

+0

其實並不重要,只是提出數據就足夠了,WP對於上下文來說只是瑣事。 – Rarst