重新索引树数组php的元素

时间:2018-12-21 15:36:25

标签: php

我尝试了很多代码,但是这给了我接近我想要的结果。  我想在这种情况下将第二个数组'eric'=> array转换为整数'0'=> array

的子元素的键
while($d = mysqli_fetch_assoc($result)) {
    if(!isset($data[$d['country']])) {
       $data[$d['country']] = array(
         'text' => $d['country'],
         'nodes' => array()  
       ); 
    }
    if(!isset($data[$d['country']]['nodes'][$d['name']])) {
        $data[$d['country']]['nodes'] = array_values($data[$d['country']]['nodes']);
        $data[$d['country']]['nodes'][$d['name']] = array(
          'text' => $d['name'],
          'nodes' => array()
        );    
     }
    array_push($data[$d['country']]['nodes'][$d['name']]['nodes'], $d['n_doc']);
}

但是带有节点的第一条记录不接受它,如下所示:

0 => Array
('text' => 'paris',
 'nodes' => Array
        ('0' => Array
                (  'text' => 'eric',
                   'nodes' => Array
                       (0 => Array
                           (
                            'text' => 'so.png',              
                           ),
                        1 => Array
                           (
                            'text' => 'dd.png',              
                           ),
                        2 => Array
                           (
                            'text' => 'dd.png',              
                           ),
                       ),
                ),
        ),
            ('charl' => Array
                (  'text' => 'charl',
                   'nodes' => Array
                       (0 => Array
                           (
                            'text' => 'so.png',              
                           ),
                       ),
                ),
        ),
),

任何人都可以告诉我问题出在哪里。  我想要这样的数组:

0 => Array
('text' => 'paris',
 'nodes' => Array
        ('0' => Array
                (  'text' => 'eric',
                   'nodes' => Array
                       (0 => Array
                           (
                            'text' => 'so.png',              
                           ),
                        1 => Array
                           (
                            'text' => 'dd.png',              
                           ),
                        2 => Array
                           (
                            'text' => 'so.png',              
                           ),
                       ),
                ),
        ),
      ('1' => Array
                (  'text' => 'charl',
                   'nodes' => Array
                       (0 => Array
                           (
                            'text' => 'so.png',              
                           ),
                       ),
                ),
        ),
),

1 个答案:

答案 0 :(得分:2)

在遍历每个国家/地区后,可能在关键节点上使用array_map()。然后,我们可以在array_keys()上使用它们array_search()来查找节点“文本”的位置以使其为数字。

  

Live demo

for($i = 0; $i <= count($data) -1; $i++) { # This loops through each country
    $data[$i]['nodes'] = array_map(function($node) use($data, $i) { # This preserves the parent text value
        return array(
            'text'  => array_search($node['text'], array_keys($data[$i]['nodes'])), # This replaces the text with a numerical value
            'nodes' => $node['nodes'] # Preserve this
        );
    }, $data[$i]['nodes']);
}
  

输出

[ ... => [ text => Paris, nodes => [ text => 0, ... ] ... ] ... ]

更新:要将所有子键更改为数字值,只需使用array_values()

  

Live Demo

for($i = 0; $i <= count($data) -1; $i++) {
    $data[$i]['nodes'] = array_map(function($nodes) {
        $newArr = array($nodes['text']);
        array_push($newArr, array_values($nodes['nodes']));
        return $newArr;
    }, $data[$i]['nodes']);
}
  

输出

[ ... => [ text => Paris, nodes => [ 0 => Paris, 1 => [ ... ] ] ... ] ... ]

Output在保留父名称的同时用数字值替换名称。