2012-06-18 4 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

더 많은 데이터가 필요하다고 생각합니다. 예를 들어 parent = 26 인 객체는 레벨 2에 있습니다. 이제 어떻게합니까? parent_id와 그 레벨을 가질 어레이가 있어야합니다. 그런 다음 배열을 반복하고 원하는 것을 빌드 할 수 있습니다. 이 multidemnsional 배열 인 경우는 데이터를 통해 (더 고아 등), 수 루프를 유효한 구조를 가정하지 array_walk_recursive

+2

_For 예는 '0'이 그들로부터 시작하여, 첫번째 인 수준 ID'26'에 결정함으로써 어떻게 당신에게 지금 그렇게? _ (26)은 레벨 2에있다 = 부모 개체. 이것은 WordPress에서 매우 충분하고 일반적인 계층 구조 데이터입니다. :) – Rarst

+0

그는 Wordpress라고 언급하지 않았습니다. – Zefiryn

+0

은 실제로는 데이터가 충분하지 않다는 것을 알기 때문에, WP는 단지 컨텍스트에 대한 사소한 것입니다. – Rarst

1

현실이 서로를 채찍 빠르고, 종류의 더러운 그러나 나는 그것이 당신이 필요로하는 것이라고 생각한다.

http://snipt.org/vagU0