Q: данные загрузки Yii2 из базы данных

Я хотел бы предложить следующий подход - для нахождения кратчайших путей в графе с помощью map-reduce.

Давайте начнем с крошечного примера, что приведет к интуиции относительно дальнейшей реализации алгоритма.

Представьте, что информация о графике хранится в виде списков смежности (с полезной нагрузкой, представляющей пути между соответствующими узлами). Например:

A -> [ {B, "A-B"}, {C, "A-C"}, {D, "A-D"} ]

Из приведенного примера - мы можем «вывести» информацию о следующих соединениях в графике:

1) Прямые соединения

  • A -> B (путь: "A-B")
  • A -> C (путь: "A-C")
  • A -> D (путь: "A-D" ])

2) Транзитивные соединения через узел A

  • B -> C (путь: "B-A-C") (где path("B -> C") == reverse(path("A -> B")) + path("A -> C"))
  • C -> B (путь: "C-A-B")
  • C -> D (путь: "C-A-D")
  • D -> C (путь: "D-A-C")
  • D -> B (путь: "D-A-B")
  • B -> D (путь: "B-A-D")

Другими словами: мы просто «отображает» одну запись списка смежности - нескольким парам доступных друг другу узлов (для всех сгенерированных пар - существует путь).

Каждая пара узлов фактически представляет собой соединение: Source -> Target.

Итак, теперь мы можем объединить все пары, которые имеют один и тот же исходный узел:

Source -> [{Target 1, "Path-to-Target-1"}, {Target 2, "Path-to-target-2"}, ...]

Собственно, после комбинации - каждый источник будет связанный со списком целевых узлов: список может содержать дублированные целевые узлы ( дублированные целевые узлы, просто соответствуют различным возможным путям).

Итак, нам просто нужно удалить дубликаты из списка целевых узлов (чтобы сохранить только те целевые узлы, которые соответствуют самым коротким путям).

Два абзаца сверху - фактически описывает этап уменьшения. Результат шага уменьшения - это то же самое, что и вход для шага карты.

Итак, наконец - просто повторите эти шаги уменьшения карты до сходимости.

1
задан gipsy 13 July 2018 в 18:34
поделиться

1 ответ

Вы можете использовать ListView и создавать любую структуру с использованием карт UiKit или материального дизайна.

Виджет ListView используется для отображения данных от поставщика данных. Каждая модель данных создается с использованием указанного файла представления. Поскольку он предоставляет такие функции, как разбиение на страницы, сортировка и фильтрация из коробки, удобно отображать информацию конечному пользователю и создавать данные, управляющие пользовательским интерфейсом.

Типичное использование выглядит следующим образом :

use yii\widgets\ListView;
use yii\data\ActiveDataProvider;


echo ListView::widget([
    'dataProvider' => $dataProvider,
    'itemView' => '_ui-card',
    'viewParams' => [
       'fullView' => true,
       'context' => 'main-page',
    ],
]);

Файл представления _ui-card может содержать следующую базовую карту html:

<?php
use yii\helpers\Html;
use yii\helpers\HtmlPurifier;
?>
<div class="uk-card">
    <div class="uk-card-header">
        <h3 class="uk-card-title"><?= Html::encode ( $model->title ) ?></h3>
    </div>
    <div class="uk-card-body"><img src="<?= Html::encode ( $model->image ) ?>"><?= Html::encode ( $model->link ) ?></div>
    <div class="uk-card-footer"></div>
</div>

Таким образом вы можете показать каждый проект как отдельную карту, используя файл вида , Надеюсь, это поможет

2
ответ дан Muhammad Omer Aslam 17 August 2018 в 12:15
поделиться
  • 1
    Большое вам спасибо, это то, что я хотел! Теперь может кто-нибудь сказать мне, есть ли возможность не показывать запись «Показывать 1-13 из 13 предметов» и «Главная / Проект» выше? – gipsy 14 July 2018 в 12:21
  • 2
    @gipsy вы можете использовать опцию $layout для их настройки, см. здесь yiiframework.com/doc/api/2.0/… – Muhammad Omer Aslam 14 July 2018 в 13:04
Другие вопросы по тегам:

Похожие вопросы: