Создание многомерных массивов, которые перебирают информацию базы данных

Я чувствую себя действительно глупо, спрашивая об этом, и я искал раньше и имел некоторую помощь, но не очень. Я очень хочу понять, как это сделать.

В основном я хочу, чтобы результат был что-то вроде этого

Проблема, с которой я столкнулся, заключается в том, что я не уверен, как убедиться, что тип не является дочерним типом, и перебирать бесконечно, если это необходимо для подтипов … или, по крайней мере, 3, возможно, 4 раза.

Вот дамп SQL.
Вот мой не рабочий код.
Вот что это выводит.
Вот что я хочу это вывести (обратите внимание, что идентификаторы типов в подтипах используются вместо того, чтобы начинаться с 1, обратите внимание также на то, что если бы у сонета был подтип, то он сделал бы то же самое для сонета).

Если бы кто-нибудь мог мне помочь, это было бы замечательно. Я очень хочу научиться и понимать, как сделать это правильно, но я очень потерян!

Извините за все ссылки, которые я продолжаю получать «ваш пост имеет неправильно отформатированный код», даже используя предварительные теги для этой первой ссылки …. это было грубое сообщение :(.

0

Решение

С таким большим примером кода сложно провести какое-либо тестирование, но это может приблизить вас к цели:

<?php
function getCategoriesTypes($workIndexOptions)
{
global $smcFunc, $scripturl, $user_info, $modSettings, $txt;
global $settings, $options, $context, $sourcedir;

$result_work_cats_and_types = $smcFunc['db_query']('workindex_fetch_cats_and_types' , '
SELECT
c.id_cat,
c.cat_order,
c.cat_name,
c.cat_desc,
t.id_type,
t.id_cat AS parent_cat,
t.id_parent,
t.child_level,
t.type_order,
t.type_name,
t.type_desc,
t.num_works,
t.num_comments,
t.unapproved_comments
FROM
{db_prefix}works_categories AS c,
{db_prefix}works_types AS t
WHERE
c.id_cat = t.id_cat

');

// Start with an empty array.
$work_categories = array();

while ($row = $smcFunc['db_fetch_assoc']($result_work_cats_and_types)) {
if (!isset($work_categories[$row['id_cat']])) {
$work_categories[$row['id_cat']] = array(
'id' => $row['id_cat'],
'order' => $row['cat_order'],
'name' => $row['cat_name'],
'description' => $row['cat_desc'],
'href' => $scripturl . '#c' . $row['id_cat'],
'types' => array()
);
}

$idCat      =   $row['id_cat'];
$idType     =   $row['id_type'];
$idOrder    =   $row['order'];
// You shouldn't generate these two arrays at the same time on every loop
// Try doing if for the first, else for the rest.
// Identify a unique element like order and child.
// Assuming `child_level` will always be 0 for parent and signify new
// array when `order` changes (I am not sure, it's hard to tell how you
// are signifying organizing triggers. The order seems common to child and parent arrays...??)
if($row['child_level'] == 0 && !isset($work_categories[$idCat]['types'][$idOrder])) {
// I put $row['order'] here as the identifying array key because I don't
// see any other difference from your other keys that indicate new array
$work_categories[$idCat]['types'][$idOrder] = array(
'id' => $row['id_type'],
'order' => $row['type_order'],
'parent_cat' => $row['parent_cat'],
'child_level' => $row['child_level'],
'name' => $row['type_name'],
'description' => $row['type_desc'],
'works' => $row['num_works'],
'comments' => $row['num_comments'],
'href' => $scripturl . '?type=' . $row['id_type'] . '.0',
'link' => '<a href="' . $scripturl . '?type=' . $row['id_type'] . '.0">' . $row['type_name'] . '</a>',
'types' => array());
}
else {
// Use the `order` key here (I am assuming)
$work_categories[$idCat]['types'][$idOrder]['types'][$idType] = array(
'id' => $row['id_type'],
'order' => $row['type_order'],
'parent_cat' => $row['parent_cat'],
'child_level' => $row['child_level'],
'name' => $row['type_name'],
'description' => $row['type_desc'],
'works' => $row['num_works'],
'comments' => $row['num_comments'],
'href' => $scripturl . '?type=' . $row['id_type'] . '.0',
'link' => '<a href="' . $scripturl . '?type=' . $row['id_type'] . '.0">' . $row['type_name'] . '</a>');
}
}
} ?>
0

Другие решения

Я наконец получил это работать с этим 🙂

function getCategoriesTypes($workIndexOptions)
{
global $smcFunc, $scripturl, $user_info, $modSettings, $txt;
global $settings, $options, $context, $sourcedir;

$result_work_cats_and_types = $smcFunc['db_query']('workindex_fetch_cats_and_types' , '
SELECT
c.id_cat,
c.cat_order,
c.cat_name,
c.cat_desc,
t.id_type,
t.id_cat AS parent_cat,
t.id_parent,
t.child_level,
t.type_order,
t.type_name,
t.type_desc,
t.num_works,
t.num_comments,
t.unapproved_comments
FROM
{db_prefix}works_categories AS c,
{db_prefix}works_types AS t
WHERE
c.id_cat = t.id_cat
ORDER BY
c.cat_order, t.id_parent
');

// Start with an empty array.
$work_categories = array();

while ($row = $smcFunc['db_fetch_assoc']($result_work_cats_and_types))
{
if (!isset($work_categories[$row['id_cat']]))
{
$work_categories[$row['id_cat']] = array(
'id' => $row['id_cat'],
'order' => $row['cat_order'],
'name' => $row['cat_name'],
'description' => $row['cat_desc'],
'href' => $scripturl . '#c' . $row['id_cat'],
'types' => array() ,
);
}if (($work_categories[$row['child_level']]) == 0)
{
$work_categories[$row['id_cat']]['types'][$row['id_type']] = array(
'id' => $row['id_type'],
'order' => $row['type_order'],
'parent_cat' => $row['parent_cat'],
'parent' => $row['id_parent'],
'child_level' => $row['child_level'],
'name' => $row['type_name'],
'description' => $row['type_desc'],
'works' => $row['num_works'],
'comments' => $row['num_comments'],
'href' => $scripturl . '?type=' . $row['id_type'] . '.0',
'link' => '<a href="' . $scripturl . '?type=' . $row['id_type'] . '.0">' . $row['type_name'] . '</a>',
'types' => array() ,
);
}

if (($work_categories[$row['child_level']]) > 0)
{
$work_categories[$row['id_cat']]['types'][$row['id_parent']]['types'][$row['id_type']] = array(
'id' => $row['id_type'],
'order' => $row['type_order'],
'parent_cat' => $row['parent_cat'],
'parent' => $row['id_parent'],
'child_level' => $row['child_level'],
'name' => $row['type_name'],
'description' => $row['type_desc'],
'works' => $row['num_works'],
'comments' => $row['num_comments'],
'href' => $scripturl . '?type=' . $row['id_type'] . '.0',
'link' => '<a href="' . $scripturl . '?type=' . $row['id_type'] . '.0">' . $row['type_name'] . '</a>',
);
}
}
$smcFunc['db_free_result']($result_work_cats_and_types);

// Let's return something....
return $work_categories;}
0

По вопросам рекламы [email protected]