使用PHP,将纯文本列表转换为关联数组的最佳方法是什么。
纯文本列表结构如下所示:
Item 1
Item 1 > Sub Item 1.1
Item 1 > Sub Item 1.2
Item 2
Item 2 > Sub Item 2.1 > Sub Sub Item 2.1.1
Item 2 > Sub Item 2.1 > Sub Sub Item 2.1.2
Item 2 > Sub Item 2.1 > Sub Sub Item 2.1.2 > Sub Sub Sub Item 2.1.2.1
Item 2 > Sub Item 2.2 > Sub Sub Item 2.2.1
Item 2 > Sub Item 2.2 > Sub Sub Item 2.2.2
Item 3
Item 4
Item 4 > Sub Item 4.1
函数/方法不限于特定深度。
所需的数组看起来像这样:
$array['Item 1']['Sub Item 1.1'];
$array['Item 1']['Sub Item 1.2'];
$array['Item 2']['Sub Item 2.1'];
$array['Item 2']['Sub Item 2.1']['Sub Sub Item 2.1.1'];
$array['Item 2']['Sub Item 2.1']['Sub Sub Item 2.1.2'];
$array['Item 2']['Sub Item 2.1']['Sub Sub Item 2.1.2']['Sub Sub Sub Item 2.1.2.1'];
$array['Item 2']['Sub Item 2.2']['Sub Sub Item 2.2.1'];
$array['Item 2']['Sub Item 2.2']['Sub Sub Item 2.2.2'];
$array['Item 3'];
$array['Item 4'];
$array['Item 4']['Sub Item 4.1'];
我不确定这是否是最好采用的阵列结构。
在用户界面......
该数组将用于通过jQuery.ajax填充一系列heirachal下拉列表, 其中子列表的内容取决于父选择。
用户选择项目2,出现带有子项目的新列表, 如果他们选择Sub Sub Item 2.1.2,那么第三个 列表与Sub Sub Sub Item 2.1.2.1一起出现,因为它是唯一的选项。
我可以做所有jQuery的东西,它只是导致我头疼的PHP函数!
我包含了对数组所做的解释,因为它影响了函数编写的方式。
答案 0 :(得分:2)
使用explode
,引用分配和array_shift
:
$input = "Item 1
Item 1 > Sub Item 1.1
...
Item 4 > Sub Item 4.1";
$lines = explode("\n", $input);
$out = array();
foreach ($lines as $line) {
$parts = explode(" > ", $line);
$ref = &$out;
while (count($parts) > 0) {
if (isset($ref[$parts[0]]) === false) {
$ref[$parts[0]] = array();
}
$ref = &$ref[$parts[0]];
array_shift($parts);
}
}
echo "<pre>";
print_r($out);
似乎能给出正确的输出。