Php 如何从以制表符分隔的父/子关系的平面文件创建多维数组结构?
标题不太好,但我想我可以更好地解释我想要实现的目标,比如: 给定平面文件:Php 如何从以制表符分隔的父/子关系的平面文件创建多维数组结构?,php,arrays,recursion,parent-child,Php,Arrays,Recursion,Parent Child,标题不太好,但我想我可以更好地解释我想要实现的目标,比如: 给定平面文件: MAIN 0 Sub Heading 0 Sub Heading 1 MAIN 1 Sub Heading 0 Sub Sub Heading 0 Sub Sub Heading 1 Sub Heading 1 Sub Heading 2 Sub Sub Heading 0 Sub Sub Sub Heading 0 MAIN 2 Sub Heading 0
MAIN 0
Sub Heading 0
Sub Heading 1
MAIN 1
Sub Heading 0
Sub Sub Heading 0
Sub Sub Heading 1
Sub Heading 1
Sub Heading 2
Sub Sub Heading 0
Sub Sub Sub Heading 0
MAIN 2
Sub Heading 0
我如何从中创建嵌套的“数组数组”结构?子项是由其父项中的制表符作为前缀来定义的
目前,我正试图用php实现这一点,但没有太多的工作要展示。我一直在努力找出逻辑
我相信最好的解决方案可能是某种递归,也许是一个tab\u count变量和一个tab\u count\u天花板变量
我开始用php做这件事,但老实说,我不喜欢这种语言。哪种代码可以解决这样的问题?为了好玩,我写了这段代码
ini_set('error_reporting', -1);
ini_set('display_errors', 1);
/**
* Recognising level of current header and header itself by counting prefixes
* before header
* @param string $string
* @param string $prefix
* @param &int $level
* @param &string $header
*/
function myGetLevelAndHeader($string, $prefix, &$level, &$header)
{
preg_match('/^((?:' . preg_quote($prefix) . ')*)(.*)$/', $string, $match);
$header = $match[2];
$level = strlen($match[1]) / strlen($prefix);
}
/**
* Adding to headers array to the desired dimension without recursion
* @param &array $headers ere
* @param integer $level
* @param string $header
*/
function myAddToHeaders(array &$headers, $level, $header)
{
$array = &$headers;
while ($level--)
{
//adding new dimension
is_null($array) ? $array = array() : end($array);
$last_key = key($array);
if (!is_null($last_key) && is_array($array[$last_key]))
$array = &$array[$last_key]; // going deeper
else
$array = &$array[]; // create new element and going deeper
};
$array[] = $header;
}
/**
* Simple parsing function
* @param array $lines
* @param string $prefix
* @return array
*/
function myParse(array $lines, $prefix = ' ')
{
$headers = array();
foreach ($lines as $line)
{
myGetLevelAndHeader($line, $prefix, $level, $header);
myAddToHeaders($headers, $level, $header);
}
return $headers;
}
$lines = file('file.txt');
print_r(myParse($lines, ' '));
您可以尝试使用YAML解析器。你能改变文件的结构来包括:在每个标题中吗?我,我觉得标题更合适nice@Jessica聪明的黑客。是的,我想我能做到,是的,这可能会解决问题。我更感兴趣的是了解如何解决这个问题。显然,无论我使用什么YAML模块都可以解决这个问题。我会考虑查看他们的一些代码,看看他们想得到什么:<代码>数组(“0”=>数组(“子标题0”,“子标题1”)…< < /代码>或<代码>数组(‘主体0’=>数组(‘子标题0’=‘>’,‘子标题1’=>‘’))…< /代码>或其他?@ CasimiRethiPulePulter第二个将非常感谢!我需要消化/玩一会儿这根本不是我所期望的。然而,这是一个解决方案。有什么办法可以麻烦你用注释注释代码吗?@Kevin,照我说的做could@Kevin:你可以在重复的问题中找到更详细的解释以及如何滚动自己的问题。