Convert PHP array to JSON tree

前端 未结 3 1724
一整个雨季
一整个雨季 2020-12-04 00:48

I have got a array in this format:

array(
    array(\'id\' => 1, \'parent_id\' => null, \'name\' => \'lorem ipsum\'),
    array(\'id\' => 2, \'pa         


        
3条回答
  •  孤街浪徒
    2020-12-04 01:17

    My take (I know an answer has been accepted, but I worked on this so I'm gonna post id =P)

    // Test data
    $data = array(
        array('id' => 1, 'parent_id' => null, 'name' => 'lorem ipsum'),
        array('id' => 2, 'parent_id' => 1, 'name' => 'lorem ipsum1'),
        array('id' => 3, 'parent_id' => 1, 'name' => 'lorem ipsum2'),
        array('id' => 4, 'parent_id' => 2, 'name' => 'lorem ipsum3'),
        array('id' => 5, 'parent_id' => 3, 'name' => 'lorem ipsum4'),
        array('id' => 6, 'parent_id' => null, 'name' => 'lorem ipsum5'),
    );
    
    // Randomize, because the data may not be in a top-down order
    shuffle( $data );
    
    // Parse and inspect the result
    $builder = new TreeBuilder( $data );
    echo '
    ', print_r( $builder->getTree() ), '
    '; class TreeBuilder { protected $leafIndex = array(); protected $tree = array(); protected $stack; function __construct( $data ) { $this->stack = $data; while( count( $this->stack ) ) { $this->branchify( array_shift( $this->stack ) ); } } protected function branchify( &$leaf ) { // Root-level leaf? if ( null === $leaf['parent_id'] ) { $this->addLeaf( $this->tree, $leaf ); } // Have we found this leaf's parent yet? else if ( isset( $this->leafIndex[$leaf['parent_id']] ) ) { $this->addLeaf( $this->leafIndex[$leaf['parent_id']]['children'], $leaf ); } else { // Nope, put it back on the stack $this->stack[] = $leaf; } } protected function addLeaf( &$branch, $leaf ) { // Add the leaf to the branch $branch[] = array( 'id' => $leaf['id'] , 'name' => $leaf['name'] , 'data' => new stdClass , 'children' => array() ); // Store a reference so we can do an O(1) lookup later $this->leafIndex[$leaf['id']] = &$branch[count($branch)-1]; } protected function addChild( $branch, $leaf ) { $this->leafIndex[$leaf['id']] &= $branch['children'][] = $leaf; } public function getTree() { return $this->tree; } }

提交回复
热议问题