从格式化的数字解析儿童父母数据

时间:2019-01-20 23:18:24

标签: php

我已从电子表格导入数据。此数据包含格式如下的代码:

1 a
1.1 b 
1.2 c 
1.2.1 d 
1.2.2 e

因此,我想从这种格式中创建基于编号的子datanya。例如1(a)是1.1(b)的父数据,而1.2(c)是1.2.1(d)和1.2.1(e)的父数据。

示例输出将是:

[
    '1' => [
        'name' => 'A',
        'childs' => [
            '1.1' => [
                'name' => 'B',
            ],
            '1.2' => [
                'name' => 'C'
            ]
        ]
    ],
    '2' => [
        'name' => 'D',
        'childs' => [
            '2.1' => [
                'name' => 'F',
                'childs' => [
                    '2.1.1' => [
                        'name' => 'G'
                    ]
                ]
            ]
        ]
    ]
]

如何将数据解析为数组?有什么参考怎么解析呢?似乎找不到合适的关键字。

1 个答案:

答案 0 :(得分:0)

这是一种实现方法:

$root = array_reduce(preg_split('~(?:\r?\n|\r)~', $s), function($agg, $v) : array
{
  preg_match('~^(\d+(?:\.\d+)*)\s*(.*?)\s*$~', $v, $match);

  if(!isset($match[1]))
    return $agg;

  // rewrite array ['1'.'2'.'3'] as ['1', '1.2', '1.2.3']
  $keys = explode('.',$match[1]);
  foreach ($keys as $k => $v)
    $keys[$k] = implode('.', array_slice($keys, 0, 1+$k));

  eval( '$agg' . sprintf(str_repeat('["children"][$keys[%s]]', count($keys)) , ...array_keys($keys) ) . '["name"] = $match[2];' );

  return $agg;
}, []);

var_dump($root['children']);