2015-11-01 3 views
0

Я манипулирую массив, как показано ниже, в JavaScript.Манипулирование массивами PHP с использованием таких ссылок, как объекты JS

http://ideone.com/vH43iD

<?php 

$root = array(
    'nodes'=>array(
     '1'=>array(
      'id'=>'1', 
      'nodes'=>array(
       '4'=>array(
        'id'=>'4', 
        'nodes'=>array(
         '5'=>array(
          'id'=>'5', 
          'nodes'=>array() 
         ) 
        ) 
       ) 
      ) 
     ), 
     '2'=>array(
      'id'=>'2', 
      'nodes'=>array() 
     ), 
     '3'=>array(
      'id'=>'3', 
      'nodes'=>array() 
     ) 
    ) 
); 

foreach ($root['nodes'] as $_node_id => &$_root_node) { 
    $_put_parent = function (&$_node) use (&$_put_parent) { 
     foreach ($_node['nodes'] as $_sub_node_id => &$_sub_node) { 
      $_put_parent($_sub_node); 
      $_sub_node['parent'] = $_node; 
     } 
    }; 

    $_root_node['parent'] = null; 
    $_put_parent($_root_node); 
} 

echo '<pre>'; 
var_dump($root['nodes']['1']['nodes']['4']); 
var_dump($root['nodes']['1']['nodes']['4']['nodes']['5']['parent']); 
echo '</pre>'; 

?> 

Выход:

array(3) { 
    ["id"]=> 
    string(1) "4" 
    ["nodes"]=> 
    &array(1) { 
    [5]=> 
    array(3) { 
     ["id"]=> 
     string(1) "5" 
     ["nodes"]=> 
     array(0) { 
     } 
     ["parent"]=> 
     array(2) { 
     ["id"]=> 
     string(1) "4" 
     ["nodes"]=> 
     *RECURSION* 
     } 
    } 
    } 
    ["parent"]=> 
    array(3) { 
    ["id"]=> 
    string(1) "1" 
    ["nodes"]=> 
    &array(1) { 
     [4]=> 
     *RECURSION* 
    } 
    ["parent"]=> 
    NULL 
    } 
} 
array(2) { 
    ["id"]=> 
    string(1) "4" 
    ["nodes"]=> 
    &array(1) { 
    [5]=> 
    array(3) { 
     ["id"]=> 
     string(1) "5" 
     ["nodes"]=> 
     array(0) { 
     } 
     ["parent"]=> 
     *RECURSION* 
    } 
    } 
} 

$root['nodes']['1']['nodes']['4']['nodes']['5']['parent'] должен указывать на себя в $root['nodes']['1']['nodes']['4'] но $root['nodes']['1']['nodes']['4']['nodes']['5']['parent'] не получили родительскую ссылку.

Я делаю это часто в JavaScript, но я не понимаю, в чем проблема для php.

спасибо.

ответ

0

Я решил это с использованием ArrayObject s.

http://ideone.com/J79Wh6

<?php 

$root = new ArrayObject(array(
    'nodes'=>new ArrayObject(array(
     '1'=>new ArrayObject(array(
      'id'=>'1', 
      'nodes'=>new ArrayObject(array(
       '4'=>new ArrayObject(array(
        'id'=>'4', 
        'nodes'=>new ArrayObject(array(
         '5'=>new ArrayObject(array(
          'id'=>'5', 
          'nodes'=>new ArrayObject(array()) 
         )) 
        )) 
       )) 
      )) 
     )), 
     '2'=>array(
      'id'=>'2', 
      'nodes'=>new ArrayObject(array()) 
     ), 
     '3'=>new ArrayObject(array(
      'id'=>'3', 
      'nodes'=>new ArrayObject(array()) 
     )) 
    )) 
)); 

foreach ($root['nodes'] as $_node_id => $_root_node) { 
    $_put_parent = function ($_node) use (&$_put_parent) { 
     foreach ($_node['nodes'] as $_sub_node_id => $_sub_node) { 
      $_put_parent($_sub_node); 
      $_sub_node['parent'] = $_node; 
     } 
    }; 

    $_root_node['parent'] = null; 
    $_put_parent($_root_node); 
} 

echo '<pre>'; 
var_dump($root['nodes']['1']['nodes']['4']); 
var_dump($root['nodes']['1']['nodes']['4']['nodes']['5']['parent']); 
echo '</pre>'; 

?> 

Выход теперь:

object(ArrayObject)[5] 
    public 'id' => string '4' (length=1) 
    public 'nodes' => 
    object(ArrayObject)[6] 
     public 5 => 
     object(ArrayObject)[7] 
      public 'id' => string '5' (length=1) 
      public 'nodes' => 
      object(ArrayObject)[8] 
       ... 
      public 'parent' => 
      &object(ArrayObject)[5] 
    public 'parent' => 
    object(ArrayObject)[3] 
     public 'id' => string '1' (length=1) 
     public 'nodes' => 
     object(ArrayObject)[4] 
      public 4 => 
      &object(ArrayObject)[5] 
     public 'parent' => null 
object(ArrayObject)[5] 
    public 'id' => string '4' (length=1) 
    public 'nodes' => 
    object(ArrayObject)[6] 
     public 5 => 
     object(ArrayObject)[7] 
      public 'id' => string '5' (length=1) 
      public 'nodes' => 
      object(ArrayObject)[8] 
       ... 
      public 'parent' => 
      &object(ArrayObject)[5] 
    public 'parent' => 
    object(ArrayObject)[3] 
     public 'id' => string '1' (length=1) 
     public 'nodes' => 
     object(ArrayObject)[4] 
      public 4 => 
      &object(ArrayObject)[5] 
     public 'parent' => null