假设你有这样的数据:
// plus any additional data per entry
$data = array (
array (
'id' => '10',
'bom_level' => '2',
'parent_item_no' => '2800CF',
'comp_item_no' => '2800CF-02',
),
array (
'id' => '66',
'bom_level' => '3',
'parent_item_no' => '2800CF-02',
'comp_item_no' => '2000CF-12',
),
array (
'id' => '189',
'bom_level' => '4',
'parent_item_no' => '2000CF-12',
'comp_item_no' => '0578',
),
array (
'id' => '190',
'bom_level' => '4',
'parent_item_no' => '2000CF-12',
'comp_item_no' => '2000CF-SH11',
),
array (
'id' => '222',
'bom_level' => '5',
'parent_item_no' => '2000CF-SH11',
'comp_item_no' => '1000',
),
array (
'id' => '191',
'bom_level' => '4',
'parent_item_no' => '2000CF-12',
'comp_item_no' => '2000CF-SH12',
),
array (
'id' => '223',
'bom_level' => '5',
'parent_item_no' => '2000CF-SH12',
'comp_item_no' => '1000',
),
array (
'id' => '67',
'bom_level' => '3',
'parent_item_no' => '2800CF-02',
'comp_item_no' => '2000CF-AG01',
),
array (
'id' => '192',
'bom_level' => '4',
'parent_item_no' => '2000CF-AG01',
'comp_item_no' => '303025-20',
),
array (
'id' => '68',
'bom_level' => '3',
'parent_item_no' => '2800CF-02',
'comp_item_no' => '2000CF-PL13',
),
array (
'id' => '193',
'bom_level' => '4',
'parent_item_no' => '2000CF-PL13',
'comp_item_no' => '0500',
),
array (
'id' => '69',
'bom_level' => '3',
'parent_item_no' => '2800CF-02',
'comp_item_no' => '2000CF-PL14',
),
array (
'id' => '194',
'bom_level' => '4',
'parent_item_no' => '2000CF-PL14',
'comp_item_no' => '0187',
),
array (
'id' => '70',
'bom_level' => '3',
'parent_item_no' => '2800CF-02',
'comp_item_no' => '2000CF-SQ01',
),
array (
'id' => '195',
'bom_level' => '4',
'parent_item_no' => '2000CF-SQ01',
'comp_item_no' => '050018-20',
),
array (
'id' => '71',
'bom_level' => '3',
'parent_item_no' => '2800CF-02',
'comp_item_no' => '2000CF-WB06',
),
array (
'id' => '196',
'bom_level' => '4',
'parent_item_no' => '2000CF-WB06',
'comp_item_no' => '040013-20',
),
);
comp_item_no 是唯一的,parent_item_no 指向它的父级。以parent_item_no=0 为根节点。
您可以将其映射到另一个结构:
$map = array();
foreach ($data as $entry) {
if (!isset($map[$entry['parent_item_no']])) {
$map[$entry['parent_item_no']] = array();
}
$map[$entry['parent_item_no']][] = $entry;
}
又可以递归遍历,如下所示:
function helper($children, $map) {
if (sizeof($children) > 0) {
echo '<ul>';
foreach ($children as $parentId => $child) {
echo '<li>';
echo $child['comp_item_no'];
if ($child['comp_item_no'] !== $child['parent_item_no'] && isset($map[$child['comp_item_no']])) {
helper($map[$child['comp_item_no']], $map);
}
echo '</li>';
}
echo '</ul>';
}
}
/**
* note that '2800CF' here is manually choosen
* because it has the lowest bom_level! In your real
* code you might want to capture those nodes while
* restructuring the array (see above)
*/
helper($map['2800CF'], $map);
产生一个嵌套的ul。示例(对于上面的数据):
- 2800CF-02
- 2000CF-12
- 0578
- 2000CF-SH11
- 2000CF-SH12
- 2000CF-AG01
- 2000CF-PL13
- 2000CF-PL14
- 2000CF-SQ01
- 2000CF-WB06
演示:http://codepad.org/FJwX3Z1c