Php 从文本文件或基于选项卡空间的其他数组创建数组?

Php 从文本文件或基于选项卡空间的其他数组创建数组?,php,Php,我最终要做的是获取一个如下所示的文本文件,并将它们组织成我可以使用的东西,比如基于选项卡空间的数组 //范例// this is no tabbed space this is a tabbed space this is 2 tabbed spaces this is no tabbed space 最后我想:(最好使用PHP) 我需要保持基于\t空格的嵌套,并在遇到无\t空格时重新开始。 有什么建议或更好的方法来做到这一点 我需要从文本文件中使用此列表,将其

我最终要做的是获取一个如下所示的文本文件,并将它们组织成我可以使用的东西,比如基于选项卡空间的数组

//范例//

this is no tabbed space
     this is a tabbed space
          this is 2 tabbed spaces
this is no tabbed space 
最后我想:(最好使用PHP)

我需要保持基于\t空格的嵌套,并在遇到无\t空格时重新开始。 有什么建议或更好的方法来做到这一点

我需要从文本文件中使用此列表,将其作为类别插入数据库,并用于具有子级别的菜单项,以及根据文本文件所需的数量


我知道如何将它们放入一个数组中,但是有没有一种方法可以通过制表符空间或者如果大于一定数量的空间等来组织它们。。?我只是对此感到困惑,我尝试了许多不同的方法,但我真的迷路了。

我同意对你问题的评论,如果数据格式是一种选择,你应该重新考虑它。但是,如果不是,您可以使用类似的方法来解决问题:

$list = array ();
foreach ($lines as $line)
{
    $depth = NULL;
    $string = preg_replace ('/\t/', '', $line, -1, &$depth);
    isset ($list[$depth]) ? array_push ($list[$depth], $string) : $list[$depth] = array ($string, );
}
假定
$lines
是一个包含文本文件行的数组,类似于
文件(textfile)
分解(“\n”,file\u get\u contents(textfile))
。使用
preg\u replace()
我们从每个
$行
修剪选项卡,并从
\t
被替换为零的次数中获得
$深度
。最后,修剪后的字符串被追加到数组中,
$list[$depth]
——但是如果它没有初始化为数组,我们会这样做,并添加
$string
作为第一个元素

假设字符串中没有其他选项卡,如果是这种情况,您需要在
foreach()
循环中寻找更详细的解决方案,可能类似这样:

$depth = 0;
$string = $line;
while (preg_match ('/^\t/', $string))
{
        $string = preg_replace ('/^\t/', '', $string);
        $depth ++;
}

isset ($output[$depth]) ? array_push ($output[$depth], $string) : $output[$depth] = array ($string, );
如果执行时间是必要的,这两种解决方案都不符合条件,但它们很容易实现


还要注意的是,数组将显示为带有数字索引的数组的关联数组,这不会排序,因此如果需要排序,您可能需要使用
asort()

如果使用XML,您的任务可能会更简单。是否有一种方法可以使用XML将文本包装到文本文件中?请查看YAML,它具有基于缩进的结构。此外,还有用于PHP的YAML解析器。我同意@AlienWebguy。使用xml也可用于读取xml文件。感谢您现在查看!我曾尝试使用这些想法,但未能使其发挥作用。它只会在第一个制表符处停止,并显示该数组级别下的所有其他内容。@JohnMeher:解决方案假定制表符正确,是这样的,还是有四行或八行空白字符?在这种情况下,将正则表达式中的
\t
部分相应地更改为
(\t{4})
(\t{8})
。如果这不适用,你能将部分数据发布到某个地方吗?在那里制表符不会转换为空白?让我再试一次,我会在这里发布我想到的所有内容。我知道这已经有一段时间了,但我时不时地玩这个,仍然无法理解它。虽然我已经能够得到每行的制表符空间数。我无法理解的是如何根据条件从单个数组中筛选或动态构建一个数组。总是在嵌套的foreach和whiles循环等方面遇到问题。。当涉及递归时,循环不是我的拿手好戏。
$depth = 0;
$string = $line;
while (preg_match ('/^\t/', $string))
{
        $string = preg_replace ('/^\t/', '', $string);
        $depth ++;
}

isset ($output[$depth]) ? array_push ($output[$depth], $string) : $output[$depth] = array ($string, );