如何将3列二维PHP数组转换为无关联键的层级结构
问题:将扁平化数组转换为层级化多维数组并生成HTML列表
我有一组结构化数据,可表示为如下PHP数组:
$items = [ ['item1' => 'a', 'item2' => 'c', 'item3' => 'h'], ['item1' => 'a', 'item2' => 'c', 'item3' => 'i'], ['item1' => 'a', 'item2' => 'd', 'item3' => 'j'], ['item1' => 'a', 'item2' => 'd', 'item3' => 'k'], ['item1' => 'b', 'item2' => 'e', 'item3' => 'l'], ['item1' => 'b', 'item2' => 'e', 'item3' => 'm'], ['item1' => 'b', 'item2' => 'f', 'item3' => 'n'], ['item1' => 'b', 'item2' => 'g', 'item3' => 'o'], ];
也可以直观呈现为层级列表形式:
a c h i d j k b e l m f n g o
我需要将这些数据转换为如下格式的多维数组:
$items = [ ['a', [['c', ['h', 'i']], ['d', ['j', 'k']]]], ['b', [['e', ['l', 'm']], ['f', ['n']], ['g', ['o']]]] ];
最终目的是基于这个多维数组构建嵌套HTML列表,但目前实现思路受阻。我尝试过硬编码的解决方案,不仅代码冗余复杂,还存在索引错误,希望找到更简洁通用的实现方法。以下是我尝试的代码:
<?php $items = [ ['item1' => 'a', 'item2' => 'c', 'item3' => 'd2', 'item4' => 'f'], ['item1' => 'a', 'item2' => 'c', 'item3' => 'd2', 'item4' => 'g'], ['item1' => 'a', 'item2' => 'd', 'item3' => 'd3', 'item4' => 'h'], ['item1' => 'a', 'item2' => 'd', 'item3' => 'e', 'item4' => 'i'], ['item1' => 'b', 'item2' => 'c', 'item3' => 'e', 'item4' => 'j'], ['item1' => 'b', 'item2' => 'c', 'item3' => 'e', 'item4' => 'k'], ['item1' => 'b', 'item2' => 'c', 'item3' => 'e', 'item4' => 'l'], ['item1' => 'b', 'item2' => 'c2', 'item3' => 'e', 'item4' => 'm'], ]; $items_new = []; $item1 = ''; $item2 = ''; $item3 = ''; $item4 = ''; foreach ($items as $item): $item1_new = $item['item1']; $item2_new = $item['item2']; $item3_new = $item['item3']; $item4_new = $item['item4']; if($item1 != $item1_new) { $items_new[] = [$item1_new, []]; $item1 = $item1_new; $item2 = ''; } if($item2 != $item2_new) { $items_new[count($items_new) - 1][] = [$item2_new, []]; $item2 = $item2_new; $item3 = ''; } if($item3 != $item3_new) { $items_new[count($items_new) - 1][count($items_new[1]) - 1][] = [$item3_new, []]; $item3 = $item3_new; $item4 = ''; } if($item4 != $item4_new) { $items_new[count($items_new) - 1][count($items_new[1]) - 1][count($items_new[2]) - 1][] = [$item4_new, []]; $item4 = $item4_new; } endforeach; foreach($items_new as $items1) { if (is_string($items1)) { echo $items1 . '<br>'; } elseif (is_array($items1)) { foreach($items1 as $items2) { if (is_string($items2)) { echo ' - ' . $items2 . '<br>'; } elseif (is_array($items2)) { foreach ($items2 as $items3) { if (is_string($items3)) { echo ' --- ' . $items3 . '<br>'; } elseif (is_array($items3)) { foreach ($items3 as $items4) { if (is_string($items4)) { echo ' ----- ' . $items4 . '<br>'; } elseif (is_array($items4)) { foreach ($items4 as $items5) { if (is_string($items5)) { echo ' ------- ' . $items5 . '<br>'; } elseif (is_array($items5)) { foreach ($items5 as $items6) { } } } } } } } } } } } ?>
内容的提问来源于stack exchange,提问作者nunomira
相关产品推荐
相关产品推荐

