#php #jquery #css #sql-server
#php #jquery #css #sql-сервер
Вопрос:
У меня есть страница php, извлекающая данные из хранимой процедуры sql2000, представляющей спецификацию (спецификацию) для продукта. Прямо сейчас он отображается в виде плоской таблицы и отлично работает. Однако, после 3 дней поиска / взлома в Google, я ни за что на свете не могу понять, как преобразовать эти данные в сворачиваемую / расширяемую таблицу с отступом или UL.
Таблица выглядит следующим образом:
- ИДЕНТИФИКАТОР[<—уникальный]
- BOM_Level
- Parent_Item
- Component_Item
- Component_qty
BOM_Level — это именно тот уровень спецификации (число от 0 до 12). Я предполагал, что, поскольку это было предусмотрено, это будет просто, поскольку bom_level действительно представляет уровень отступа каждой части, но, увы, это было непросто….
Общая структура выглядит следующим образом, но количество частей и уровней зависит от продукта:
0 Top Level
1 - Assembly 1
2 - part 1 of Assembly 1
2 - part 2 of Assembly 1
2 - part 3 of Assembly 1
2 - part 4 of Assembly 1
1 - Assembly 2
2 - Assembly 1 of Assembly 2
3 - part 1 of Assembly 1 of Assembly 2
3 - part 2 of Assembly 1 of Assembly 2
3 - part 3 of Assembly 1 of Assembly 2
Я пытался сделать что-то вроде:
- Если bom_level == previous_bom_level, то создайте li
- Если уровень спецификации> previous_bom_level, добавьте новый UL и запустите новый li
- Если уровень спецификации < предыдущий уровень спецификации, завершите предыдущий UL и запустите другой набор li.
При всем сказанном я просто не могу понять, как это сделать. Есть идеи?
Комментарии:
1. У меня такое чувство, что спецификация здесь не обозначает объектную модель браузера…
2. Хороший момент! Обновленный вопрос соответственно
Ответ №1:
Предположим, у вас есть такие данные:
// 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'] amp;amp; 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
- 1000
- 2000CF-SH12
- 1000
- 2000CF-AG01
- 303025-20
- 2000CF-PL13
- 0500
- 2000CF-PL14
- 0187
- 2000CF-SQ01
- 050018-20
- 2000CF-WB06
- 040013-20
Демонстрация: http://codepad.org/FJwX3Z1c
Комментарии:
1. Когда вы говорите «родительский элемент указывает на его родительский элемент», вы имеете в виду, что родительский элемент указывает на его родительский идентификатор? Если это так (что я думаю, что это так) Я не уверен, как экстраполировать это из таблицы, поскольку «parent_ID» недоступен. Только Parent_Item_no (который является номером детали). Я уверен, что это возможно, я просто не знаю, как это сделать. Я пытался что-то подобное, но безрезультатно: if($ parent_item_no == $ oldparent_item_no){$parentid = $oldid;} else {$parentid = $id; $ oldid = $id;}
2. Я должен был добавить некоторые детали: я пытаюсь перебрать результаты ВЫЗОВА и передать эти данные в массив, который соответствует структуре данных, которую вы указали в своем примере массива (id, parentid, component_item_no). Строка кода выше находится в циклах, пытаясь вывести родительский идентификатор, сравнивая parent_item_number с предыдущим parent_item_no .
3. Да, я имел
parent
в виду идентификатор фактического родителя. Может быть, вы можете добавить некоторые данные, с которыми вы фактически работаете (возможно, используйте var_export или что-то в этом роде), чтобы я мог адаптировать пример кода.4. Из того, что вы пишете (
"parent_ID" isn't available. Only Parent_Item_no (which is the part number)
), я бы предположил, что вы могли бы просто изменитьparent
сParent_Item_no
помощью иid
с помощью элемента no. Единственное, что требуется, это то, что независимо от того, какой идентификатор вы выберете для записи, он должен быть уникальным.5. спасибо за вашу помощь до сих пор: вот пример того, как выглядит таблица: codepad.org/xZ2VLAH5