Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
3 / 3 / 1
Регистрация: 22.10.2013
Сообщений: 185

Бесконечный цикл или как?

17.06.2017, 21:54. Показов 2405. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Товарищи, подскажите, как лучше реализовать. К примеру есть таблица
`table`

id_a | id_b
1 | 0
2 | 1
3 | 2
4 | 1
5 | 3
6 | 0

Как мне вывести массив, что бы получилось так:

1
_2
__3
___5
_4
6

Сейчас попробую объяснить) это аля система чата. Где `id_a` - id сообщения, а `id_b` - id, на которое был сделан ответ.
То есть судя по таблице видно, что 2 и 4 (`id_a`) сообщения были ответом на 1 (`id_b`)
Если `id_b`==0, то это новое обычное сообщение.
Я вот как пробовал. Вывожу в массиве сначала все сообщения, у которых `id_b`=0. Потом в этом уже массиве вывожу те, у которох `id_b`=`id_a`. И как бы всё здорово, но что бы дальше выводить подобное, то нужно писать скрипт одинакового массива в предыдущем массиве до бесконечности. Можно ли как то его зациклить или как лучше это сделать? Не могу подобрать логику.. да и знаний с практикой не хватает (( помогите!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.06.2017, 21:54
Ответы с готовыми решениями:

При выводе из базы совершает бесконечный цикл
Выводим всё из таблицы. while($news = $db->FetchArray("SELECT * FROM posts ORDER BY id")){?> <div class="message"> <form...

Бесконечный цикл(
Помогите пожалуйста, не могу понять как реализовать запись в бд из файла так, чтобы записывало построчно. Вот мой php код. <?php ...

Возврат в бесконечный цикл после fatal error внутри него
Дано: бесконечный цикл (демон на php), который запускается банальным переходом по ссылке вида site.ru/daemon?key=jiowvzvd324e (key - это...

11
313 / 312 / 221
Регистрация: 11.07.2015
Сообщений: 1,107
17.06.2017, 22:37
Похожая реализация вывода дерева категорий

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    <p class="info">Выберите с помощью галочек все рубрики, которые подходят для размещения этой инициативы и нажмите кнопку Готово.</p>
    <?php
    $res = DBi::query("SELECT `id`,`rod`,`name` FROM `rubrici` ORDER BY binary(`name`) ASC");
    $kats = array();
    while ($row = $res->fetch_assoc()) {
        $kats[] = $row;
    };
    function draw_kat_table($tree,$parent,$lev) {
        $html = '';
        $inpt = '';
        reset($tree);
        foreach ($tree as $row) {
            if ($row['rod'] !== $parent) continue;
            $sup = draw_kat_table($tree,$row['id'],$lev+1);
            $col = ($lev>0 && $sup!='')?' class="collapsed"':'';
            $html .= '<li'.$col.'><input type="checkbox" name="kat[]" value="'.$row['id'].'"> <a href="katalog_idey.php?id='.$row['id'].'">'. $row['name']."</a>\n".$sup.'</li>'."\n";
        }
        if ($html=='') return '';
        if ($lev!=0) return '<ul>'."\n".$html."\n".'</ul>'."\n";
        return '<div id="jqtree"><ul>'."\n".$html."\n".'</ul></div>'."\n";
    }
    echo "\n".draw_kat_table($kats,'0',0);
    ?>
1
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
17.06.2017, 22:51
Лучший ответ Сообщение было отмечено Зеликов как решение

Решение

Не по теме:

Можно использовать MongoDB или другие nosql решения


Достать нужные сообщения
MySQL
1
SELECT * FROM `table` ORDER BY id_b, id_a
Получаться строки вот в таком порядке
id_a id_b
1 0
6 0
2 1
4 1
3 2
5 3
За 1 проход по этому массиву можно построить дерево (а может за 1 проход и нельзя, в этом случае надо в таблице хранить путь до родительского комментария, вида 1/2/3)
PHP
1
2
3
4
5
6
7
8
9
10
11
$comments = [
    1 => [
        2 => [
            3 => [
                5 => []
            ]
        ],
        4 => []
    ],
    6 => []
];
И дальше несложно рекурсивно пройтись по этому дереву и преобразовать его в html разметку.

Добавлено через 5 минут
Можно будет улучшить данную реализацию, добавив в бд поле level для глубины каждого комментария. Тогда можно будет выводить не все комментарии, и для длинных веток сделать load more.
1
3 / 3 / 1
Регистрация: 22.10.2013
Сообщений: 185
17.06.2017, 23:39  [ТС]
Jewbacabra, очень не хочу с деревом париться.. мне надо то максимум в три пролёта сделать. А дальше пусть все под третий встают, но в нужном порядке просто. Вот глянь, если время будет. Впринципе всё получается как надо.. только как то бы повторы убрать))) и мне большего не надо))
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        $result = mysqli_query($db, "SELECT * FROM `comments` GROUP BY `id`");
        while($row = mysqli_fetch_array($result)) 
        {
        echo '<b>'.$row['id'].'</b> | '.$row['id_otvet'].'<br>';
        $id = $row['id'];
        
            $result_b = mysqli_query($db, "SELECT * FROM `comments` WHERE `id_otvet`='$id' GROUP BY `id`");
            while($row_b = mysqli_fetch_array($result_b))
            {
            echo '--'.$row_b['id'].' | '.$row_b['id_otvet'].'<br>';
            $id_b = $row_b['id'];
            
                $result_c = mysqli_query($db, "SELECT * FROM `comments` WHERE `id_otvet`='$id_b' GROUP BY `id`");
                while($row_c = mysqli_fetch_array($result_c))
                {
                echo '----'.$row_c['id'].' | '.$row_c['id_otvet'].'<br>';
                $id_c = $row_c['id'];
                }
            }
        }
КОроче это лажа полная)) что груп что без груп)) всё.. мозги пухнут
0
313 / 312 / 221
Регистрация: 11.07.2015
Сообщений: 1,107
17.06.2017, 23:50
Лучший ответ Сообщение было отмечено Зеликов как решение

Решение

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    $res = mysqli_query($db, "SELECT `id`,`id_otvet` FROM `comments` ORDER BY `id_otvet` ASC, `id` ASC");
    $kats = array();
    while ($row = mysqli_fetch_array($res)) {
        $kats[] = $row;
    };
    function draw_kat_table($tree,$parent,$lev) {
        $html = '';
        reset($tree);
        foreach ($tree as $row) {
            if ($row['id_otvet'] !== $parent) continue;
            $sup = draw_kat_table($tree,$row['id'],min(3,$lev+1));
            $html .= str_repeat('--',$lev). '<b>'.$row['id'].'</b> | '.$row['id_otvet'].'<br>'."\n".$sup;
        }
        return $html;
    }
    echo draw_kat_table($kats,'0',0);
1
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
17.06.2017, 23:53
Зеликов, опять запросы в цикле...
1
3 / 3 / 1
Регистрация: 22.10.2013
Сообщений: 185
18.06.2017, 01:15  [ТС]
plohoyav, я просто фигею... работает. Я к сожалению половину не понимаю, что тут написанно, потому что с таким синтаксисом я ещё не работал.. но вот похоже настало время)) буду разбирать код этот) Пока что для меня это волшебство)) Всё работает как надо)) спасибо большое!!)!!!!!!

Добавлено через 1 минуту
Jewbacabra, да чё то я пока до более разумного ни как дорости не могу.. вот мне ману небесную товарищ кинул.. я его вставил, всё заработало. Я в шоке. И такой короткий))) Я пару месяцев занимаюсь скриптами, так что ещё учиться и учиться конечно! Спасибо большое тебе.

ps а цикл в цикле это совсем плохо?) У меня половина на этом держиться))

Добавлено через 1 час 1 минуту
plohoyav, как мне разорвать функцию, что бы в неё вставить что нибудь..
К примеру между '<b>'.$row['id'].'</b> и '.$row['id_otvet'].' мне надо заинклюдить файл..
как не разрываю, такая голимотья на экране получается_)))
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
18.06.2017, 01:23
вообще для этой задачи лучше Nested Set или базу данных поддерживаемую рекурсивные запросы
PostgreSQL , Oracle , Microsoft SQL Server
1
3 / 3 / 1
Регистрация: 22.10.2013
Сообщений: 185
18.06.2017, 06:10  [ТС]
plohoyav, Всё круто! Всё оформил. Всё как хотел. Всё работает. Но вот проблема... у меня аватары пользователей генерируются при регистрации и заносятся в свою таблицу, потом от туда выбираются. Здесь я не могу выборку сделать в фореаче.. как мне соединить два массива? Таблицу коментов и аватаров, что бы я мог данные аватаров выбирать при показе комментария?

Добавлено через 2 часа 59 минут
plohoyav, Додумался в одном мускул запросе соединить две базы данных)))) Я расту)))))) Спасибо всем большое!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
0
313 / 312 / 221
Регистрация: 11.07.2015
Сообщений: 1,107
18.06.2017, 07:56
Лучший ответ Сообщение было отмечено Зеликов как решение

Решение

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    $res = mysqli_query($db, "SELECT `id`,`id_otvet` FROM `comments` ORDER BY `id_otvet` ASC, `id` ASC");
    $kats = array();
    while ($row = mysqli_fetch_array($res)) {
        $kats[] = $row;
    };
    function draw_kat_table($tree,$parent,$lev) {
        reset($tree);
        foreach ($tree as $row) {
            if ($row['id_otvet'] !== $parent) continue;
            echo str_repeat('--',$lev). '<b>'.$row['id'].'</b>'; // выводим дефисы и id
            include 'file.php'; // инклюд
            echo ' | '.$row['id_otvet'].'<br>'."\n"; // выводим id_otvet
            draw_kat_table($tree,$row['id'],min(3,$lev+1)); // выводим вложенные
        }
    }
    draw_kat_table($kats,'0',0);
1
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
18.06.2017, 09:51
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
вообще для этой задачи лучше Nested Set
Тут лучше nested intervals, дерево комментариев же может изменяться очень часто и достигать больших размеров, и при каждой вставке придется обновлять достаточно большое число строк.
0
3 / 3 / 1
Регистрация: 22.10.2013
Сообщений: 185
18.06.2017, 11:50  [ТС]
plohoyav, Jewbacabra, ДА!!!!!! СПасибо ВАМ ВСЕМ большое!! Всё как мне надо заработало!! Огромное спасибо!)))) Без вас бы не справился

Добавлено через 18 минут
Нарадоваться и настмотреться не могу)) Ещё раз спасибо!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.06.2017, 11:50
Помогаю со студенческими работами здесь

Как реализовать бесконечный цикл While, но чтобы этот цикл не грузил процессор?
Допустим есть цикл: while (1) { ... } Как сделать так, чтобы бесконечный цикл не грузил процессор. Избавиться от...

Как реализовать бесконечный цикл?
Как реализовать вот такой бессконечный цикл суммы? \sum_{n=0}^{\infty } Я лишь придумал чтоб пользователь вводил конечное число

Как организовать бесконечный цикл?
Нужно сделать так, чтобы бесконечно показывал текст &quot;Hi!&quot; #include &lt;stdio.h&gt; void main (void) { HI:do { ...

Как прекратить бесконечный цикл?
Здравствуйте, нужна помощь. Цель: сделать пульт управления 7-ми сегментным индикатором из 4х кнопок: 1 кнопка-вывод на левом индикаторе ...

как создать бесконечный цикл
помогите)нужно чтоб можно было вводить несколько раз за сеанс)экзе файл закрывается


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru