我很惊讶没有在SO(或互联网上的其他地方)找到答案。它涉及一个嵌套的缩进列表,我希望根据缩进的级别将其转换为多维数组。
举个例子,这里有一些示例输入:
Home
Products
Product 1
Product 1 Images
Product 2
Product 2 Images
Where to Buy
About Us
Meet the Team
Careers
Contact Us
理想情况下,我想将其提供给某些(递归?)函数并获得以下输出:
array(
'Home' => array(),
'Products' => array(
'Product 1' => array(
'Product 1 Images' => array(),
),
'Product 2' => array(
'Product 2 Images' => array(),
),
'Where to Buy' => array(),
),
'About Us' => array(
'Meet the Team' => array(),
'Careers' => array(),
),
'Contact Us' => array(),
);
我对执行此类任务所需的逻辑感到困惑,所以任何帮助都会受到赞赏。
答案 0 :(得分:11)
由于目前还不清楚你是想尝试从一些给定的结构(html-dom)或从给定的字符串中读取纯文本,我认为它是你试图解析的字符串。如果是这样,请尝试:
<?php
$list =
'Home
Products
Product 1
Product 1 Images
Product 2
Product 2 Images
Where to Buy
About Us
Meet the Team
Careers
Contact Us';
function helper($list, $indentation = ' ') {
$result = array();
$path = array();
foreach (explode("\n", $list) as $line) {
// get depth and label
$depth = 0;
while (substr($line, 0, strlen($indentation)) === $indentation) {
$depth += 1;
$line = substr($line, strlen($indentation));
}
// truncate path if needed
while ($depth < sizeof($path)) {
array_pop($path);
}
// keep label (at depth)
$path[$depth] = $line;
// traverse path and add label to result
$parent =& $result;
foreach ($path as $depth => $key) {
if (!isset($parent[$key])) {
$parent[$line] = array();
break;
}
$parent =& $parent[$key];
}
}
// return
return $result;
}
print_r(helper($list));
答案 1 :(得分:0)
我不打算编写递归函数,但为了指出一个有用的方向,请看一下PHP的substr_count函数。基于此,您可以计算每行前面的选项卡数量,并将其与上一行中的选项卡数量进行比较,以确定它是否是孩子,兄弟姐妹等。
答案 2 :(得分:0)
我是唯一一个心情愉快的人吗?
输入数组几乎是一样的!,只有3种可能的方式结束:开始,整个或右括号。
$L = 4;//estimate depth level
function tabbed_text_to_array ($raw, $L) {
$raw = preg_replace("/^(\\t*)([^\\t\\n]*)\\n?/m" , "\t$1'$2' => array(\n" , $raw );
for( ; $L > 0 ; $L-- ) {
for( $i=0; $i<3 ;$i++ ) {
$preL = $L-1;
$s = array( "^(\\t{{$L}})([^\\t\\),]*)(?=\\n\\t{{$L}}')", "^(\\t{{$L}})([^\\t\\),]*)(?=\\n(\\t{0,{$preL}})')", "^(\\t{{$L}})(\\),)(?=\\n(\\t{{$preL}})[^\t])" );
$r = array( "$1$2)," , "$1$2)\n" . str_repeat("\t",$preL) . ")," , "$1),\n$3)," );
$raw = preg_replace( "/$s[$i]/m" , $r[$i], $raw );
}
}
return "array(\n". $raw. ")\n);";
}
此函数生成一个带有文字数组的字符串。然后你只需eval()吧。 它没有它看起来那么糟糕。双反斜杠使阅读更难,但很简单。
与细胞再生一样,它首先在一个通道中添加最常见的东西:引号,逗号和开括号,然后它在两个通道中添加较小的细节。所有这些都为你指定的每个级别运行一次(你可以浪费代码来找出最深层次来开始处理,但猜测就足够了。)
参见工作演示/ tool to convert tab-indented text into array
或者访问带有所有通行证的php fiddle,以便您可以对此进行展开。
答案 3 :(得分:-2)
PHP Scripts上有一个类可以满足您的需求。你可以在这里找到它: Array To List
它需要一个多维数组并创建HTML。
<强>更新强>
实际上需要与此相反。要做到这一点,最好使用DOMDocument对象并将HTML加载到对象表示中。