2016-09-16 40 views
0

我想展平一個物體。這是我到目前爲止:保持秩序時展平多維物體

{ 
    "1": { 
     "id": 1, 
     "name": "parent", 
     "children": { 
      "4": { 
       "id": 4, 
       "name": "child1", 
       "parent": 1 
      }, 
      "5": { 
       "id": 5, 
       "name": "child2", 
       "parent": 1 
      } 
     } 
    }, 
    "2":{ 
     "id": 2, 
     "name": "parent2" 
    } 
} 

這就是我想要完成的。因此,保持相同的順序,但扁平的對象:

{ 
    "1": { 
     "id": 1, 
     "name": "parent", 
    }, 
    "4": { 
     "id": 4, 
     "name": "child1", 
     "parent": 1 
    }, 
    "5": { 
     "id": 5, 
     "name": "child2", 
     "parent": 1 
    }, 
    "2": { 
     "id": 2, 
     "name": "parent2" 
    } 
} 

到目前爲止我還沒有找到解決方案。我嘗試了一個沒有太多成功的功能:

protected function _flattenObject($array) 
{ 
    static $flattened = []; 
    if(is_object($array) && count($array) > 0) 
    { 
     foreach ($array as $key => $member) { 
      if(!is_object($member)) 
      { 
       $flattened[$key] = $member; 
      } else 
      { 
       $this->_flattenObject($member); 
      } 
     } 
    } 
    return $flattened; 
} 

對我來說,困難的部分是保持相同的順序(孩子低於其父母)。上面提到的函數也刪除了所有的對象,並且幾乎只保留了它的值,所以它並不是很成功。

希望在這裏有人知道這個很好的解決方案。

順便說一句,我想要這樣的扁平結構的原因是因爲我必須使用的系統,無法處理多維數組和對象。我仍然希望顯示一個層次結構,這可能與我描述的扁平化結構有關,因爲對象實際上也包含一個「級別」鍵,所以我可以給它們一些基於「級別」的填充,同時仍然顯示在它們的下面家長。

編輯: JSON似乎不是有效的,所以我修改了一下。

+0

您的原始數據是指對象的數組,還是作爲對象的對象是正確的? –

+0

@The One and Only ChemistryBlob確實是一個物體的對象。 –

+0

@Ryan Vincent JSON對象現在應該是有效的 –

回答

1

主要的問題似乎是你沒有對遞歸函數的返回結果做任何事情。除非使用static的方法裏面做了一些魔術,我不知道......

所以本節:

 if(!is_object($member)) 
     { 
      $flattened[$key] = $member; 
     } else 
     { 
      // What happens with the returned value? 
      $this->_flattenObject($member); 
     } 

可能應該更多這樣的:

 if(!is_object($member)) 
     { 
      $flattened[$key] = $member; 
     } else 
     { 
      // Add the returned array to the array you already have 
      $flattened += $this->_flattenObject($member); 
     } 
+0

謝謝Jeroen,但目前它只返回最後一個對象,id 2是確切的。我沒有想到......奇怪。即使沒有'+',所以有些東西變得非常錯誤。猜猜我必須先排除故障。一想到這一點,我會盡快回復你。 –

+0

我做了一些測試,不幸的是這個功能根本不起作用。在將子項移動到根級別時,保留對象似乎非常困難。要麼它平整一切(所以我只有一個包含鍵和值的數組),或者它保持相同的結構,實際上什麼都不做。 –

0

這裏代碼有效。它向對象添加一個字段「級別」,以表示它們原有層次結構中的深度級別。

<?php 

$obj = json_decode('[{ 
    "id": 1, 
    "name": "parent", 
    "children": [{ 
     "id": 4, 
     "name": "child1", 
     "parent": 1 
    }, { 
     "id": 5, 
     "name": "child2", 
     "parent": 1 
    }] 
}, { 
    "id": 2, 
    "name": "parent2" 
}]'); 


function _flattenRecursive($array, &$flattened, &$level) 
{ 
    foreach ($array as $key => $member) { 
     $insert = $member; 
     $children = null; 
     if (is_array($insert->children)) { 
      $children = $insert->children; 
      $insert->children = array(); 
     } 
     $insert->level = $level; 
     $flattened[] = $insert; 
     if ($children !== null) { 
      $level++; 
      _flattenRecursive($children, $flattened, $level); 
      $level--; 
     } 
    } 
} 

function flattenObject($array) 
{ 
    $flattened = []; 
    $level = 0; 

    _flattenRecursive($array, $flattened, $level); 

    return $flattened; 
} 

$flat = flattenObject($obj); 

var_dump($flat); 

?> 
+0

謝謝,但你檢查一個數組有點奇怪,而在我的例子中,json只是一個對象。 –