- Родословная / Генеалогическое древо из базы данных
- Решение
- Другие решения
- Saved searches
- Use saved searches to filter your results more quickly
- family-tree
- Here are 12 public repositories matching this topic.
- nafiesl / silsilah
- fisharebest / webtrees
- laravel-liberu / genealogy
- familytree365 / backend
- piyushparkash / FamilyTree
- williamcasey / lineage
- kiran94 / FamilyTree
- malamalca / famiree
- BlasiusSecundus / branch_export
- jrmajor / arbor
- bernardkissi / familyKonnect
- junderw00d / jcGenealogy
- Improve this page
- Add this topic to your repo
- Update: Family Tree PHP 1.5 (beta)
- Update: Family Tree PHP 1.4.1 (stable)
- Update: Family Tree PHP 1.4b (stable)
- Some bugs fixed in version 1.4 (beta)
- Update: Family Tree PHP 1.4 (beta)
- Структура данных «Семейное древо»
- Класс человека
- Дружественные сумматоры и получатели
- Создание людей
- Отобразить семейное дерево
Родословная / Генеалогическое древо из базы данных
постскриптум ‘horse_dam’ и ‘horse_sire’ представляют родителей …
Я потратил дни на эту проблему, поиск, эксперименты …
И в настоящее время у меня есть это частично решение:
display_children($selected_horse_id, 5); function display_children($parent, $level) < mysql_connect('localhost','root',''); mysql_select_db('hdb'); $result = mysql_query('SELECT * FROM horses WHERE horse_id="'.$parent.'";');while ($row = mysql_fetch_array($result)) < echo ""; echo $row['horse_name']; echo " "; display_children($row['horse_dam'], $level+1); display_children($row['horse_sire'],$level+1); > >
который генерирует таблицу в одну строку 🙁 Я не могу придумать, как правильно ее реализовать …
И результат, который я хочу, это Родословная Query
Любая помощь или подсказка высоко ценится :),
заранее спасибо
Решение
Я уже решил проблему несколько месяцев назад … Я отправляю ответ, так что это может быть полезно для других разработчиков …
постскриптум Проект был написан на Yii 1.1
Во-первых, по моему HorseController назначенная переменная типа приватного массива, где я собираюсь сохранить родословную:
Затем я написал функцию, которая будет получать все узлы (родители) из базы данных:
public function getParents($id) < global $horses; $horses[] = Horses::model()->findByPk($id)->horse_id; if($this->loadModel($id)->horse_sire != null && $this->loadModel($id)->horse_dam != null) < $this->getParents($this->loadModel($id)->horse_sire); $this->getParents($this->loadModel($id)->horse_dam); > return $horses; >
Затем я изменил ActionView функция, в которой все узлы из базы данных будут переданы в View
public function actionView($id) < $this->horses = $this->getParents($id); $this->render('view',array( 'model'=>$this->loadModel($id), 'parents'=>$this->horses, )); >
И, наконец, немного Гадкого Кода, который покажет родословную (вот так Родословная Query ) 🙂
"; echo ""; echo "baseUrl."/index.php/horses/".Horses::model()->model()->findByPk($parents[$i])->horse_id." >"; echo Horses::model()->model()->findByPk($parents[$i])->horse_name; echo ""; echo "
"; echo Horses::model()->model()->findByPk($parents[$i])->horse_yob; echo " "; if($reverse_multiplier == 1 || $reverse_multiplier == 0.5) echo ""; if($reverse_multiplier == 0.5 && $last_node_count if($reverse_multiplier == 0.5 || $reverse_multiplier == 1) $last_node_count++; > ?>
И это все 🙂 Надеюсь, это было полезно …
Другие решения
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
family-tree
Here are 12 public repositories matching this topic.
nafiesl / silsilah
A genealogy/family tree application, built with Laravel.
fisharebest / webtrees
laravel-liberu / genealogy
Laravel 10.x backend using PHP 8.2. Family tree and genealogy data processing website software.
familytree365 / backend
Laravel 8 backend for a genealogy website.
piyushparkash / FamilyTree
Vanshavali:- FamilyTree is simple PHP Application targetting the collection of family data which can viewed with beautiful visualisation. You can add/update data, play with the visualisation, show you children their roots, add new members as they enter your family.
williamcasey / lineage
Algorithm for determining the genealogical relationship (consanguinity) between two members in a family tree, all contained within a simple PHP class.
kiran94 / FamilyTree
A web application to store and track a family tree.
malamalca / famiree
Famiree is an open source PHP Family Tree
BlasiusSecundus / branch_export
Export helper module for the open source family tree software, Webtrees.
jrmajor / arbor
Genealogy application built in PHP
bernardkissi / familyKonnect
Family circle app — connects family members all of the world
junderw00d / jcGenealogy
Improve this page
Add a description, image, and links to the family-tree topic page so that developers can more easily learn about it.
Add this topic to your repo
To associate your repository with the family-tree topic, visit your repo’s landing page and select «manage topics.»
Update: Family Tree PHP 1.5 (beta)
A new version of Family Tree PHP is now released: version 1.5. It is only a beta version for now. Users who have a license for version 1.x will receive a download link for this version today.
Read the rest of this entry »
Posted in Updates | Comments Off on Update: Family Tree PHP 1.5 (beta)
Update: Family Tree PHP 1.4.1 (stable)
A new version of Family Tree PHP is now released: version 1.4.1. All existing users are encouraged to upgrade to the new version. Registered users will get the new download link today.
Read the rest of this entry »
Posted in Updates | Comments Off on Update: Family Tree PHP 1.4.1 (stable)
Update: Family Tree PHP 1.4b (stable)
Version 1.4 of Family Tree PHP is now declared stable. All existing users who still use version 1.3 or earlier are encouraged to upgrade to the new version. Registered users will get the new download link today.
Read the rest of this entry »
Posted in Updates | Comments Off on Update: Family Tree PHP 1.4b (stable)
Some bugs fixed in version 1.4 (beta)
Some bugs have been fixed in version 1.4 (beta). A new corrected version (1.4a) is now available for download. Registered users will get the new download link today.
Read the rest of this entry »
Posted in Updates | Comments Off on Some bugs fixed in version 1.4 (beta)
Update: Family Tree PHP 1.4 (beta)
A new version of Family Tree PHP is now released: version 1.4. It is only a beta version for now, because there are many updates in 3rd party libraries, which cause some unexpected behavior. Users who have a license for version 1.x will receive a download link for this version today.
Read the rest of this entry »
Posted in Updates | Comments Off on Update: Family Tree PHP 1.4 (beta)
Структура данных «Семейное древо»
Я ищу способ представления генеалогического дерева в PHP. Это означает, что детям необходимо наследовать от двух (или более) родителей.
- 1, 2 и более родителей
- Бонусные баллы, если я могу прикрепить метаданные, например, фамилию или статус отношений
Вот моя нерабочая попытка (без массивов в виде ключей, к сожалению):
$tree = array( 'uncle' => false, // no children array('mom', 'dad') => array( 'me' => false, array('brother', 'sister-in-law') => array( 'niece' => false ) ) );
Вопрос в том, как я могу представить генеалогическое древо с этими требованиями?
Вы не сможете сделать все это в одном array() . Вы можете настроить такие деревья, но для создания более сложных графиков с несколькими родителями и другими отношениями требуется несколько строк кода.
Это очень поможет, если вы выбросите OO. Давайте создадим класс Person чтобы помочь управлять отношениями. По сути, у нас есть люди и их отношения с другими людьми, поэтому мы начнем там.
Класс человека
Я думаю, что каждый человек имеет множество отношений. Этот массив будет сначала индексироваться по типу отношений, например «родители» или «дети». Каждая запись будет представлять собой массив Person s.
class Person < var $name, $relations; function __construct($name) < $this->name = $name; $this->relations = array(); > function addRelation($type, $person) < if (!isset($this->relations[$type])) < $this->relations[$type] = array(); > $this->relations[$type][] = $person; > // Looks up multiple relations, for example "parents". function getRelations($type) < if (!isset($this->relations[$type])) < return array(); >return $this->relations[$type]; > // Looks up a single relation, for example "spouse". function getRelation($type) < $relations = $this->getRelations($type); return empty($relations) ? null : $relations[0]; > function __toString() < return $this->name; >
Дружественные сумматоры и получатели
С вышеприведенным в качестве основы мы можем затем добавить несколько более дружественных имен методов. Для иллюстрации мы рассмотрим отношение родителя / ребенка и супругов.
function addParents($mom, $dad) < $mom->addChild($this); $dad->addChild($this); > function addChild($child) < $this ->addRelation('children', $child); $child->addRelation('parents', $this); > function addSpouse($spouse) < $this ->addRelation('spouse', $spouse); $spouse->addRelation('spouse', $this); > function getParents () < return $this->getRelations('parents'); > function getChildren() < return $this->getRelations('children'); > function getSpouse () < return $this->getRelation ('spouse'); > >
Создание людей
Теперь мы можем создать пару людей и установить их отношения. Давайте попробуем Билли и его родителей Джона и Джейн.
$john = new Person('John'); $jane = new Person('Jane'); $billy = new Person('Billy'); $john ->addSpouse ($jane); $billy->addParents($jane, $john);
И мы можем проверить их отношения так:
echo "John is married to " . $john->getSpouse() . ".\n"; echo "Billy's parents are " . implode(" and ", $billy->getParents()) . ".\n";
Джон женат на Джейн.
Родители Билли – Джейн и Джон.
Отобразить семейное дерево
Мы можем пересекать график рекурсивно, если он растет. Вот пример древовидной функции, которая отображает рудиментарное генеалогическое древо. Я добавил Сару, ее мужа Майка и их сына Бобби к миксу.
$john = new Person('John'); $jane = new Person('Jane'); $sara = new Person('Sara'); $mike = new Person('Mike'); $bobby = new Person('Bobby'); $billy = new Person('Billy'); $john ->addSpouse ($jane); $sara ->addParents($jane, $john); $sara ->addSpouse ($mike); $bobby->addParents($sara, $mike); $billy->addParents($jane, $john); function displayFamilyTree($root, $prefix = "") < $parents = array($root); if ($root->getSpouse() != null) < $parents[] = $root->getSpouse(); > echo $prefix . implode(" & ", $parents) . "\n"; foreach ($root->getChildren() as $child) < displayFamilyTree($child, ". $prefix"); >> displayFamilyTree($john);
Изменить: Вот комментарий @ Wrikken ниже, воспроизведенный для удобства чтения:
Об этом действительно. ИМХО добавляет от даты до каждого отношения хотя (возможно, NULL без конца). Разводы бывают, как и усыновления, и т. Д. Также: я бы добавил обратные типы & ‘ping-back’ к функции addRelation() :
function addRelation($type, $person, $reverseType, $pingback = false) < if (!isset($this->relations[$type])) < $this->relations[$type] = array(); > if (!in_array($person, $this->relations[$type], true)) < $this->relations[$type][] = $person; > if (!$pingback) < $person->addRelation($reverseType, $this, $type, true); > >
GEDCOM – это открытая спецификация для обмена генеалогическими данными между различными программами генеалогии. Файл GEDCOM представляет собой простой текст (обычно ANSEL или ASCII), содержащий генеалогическую информацию о физических лицах и метаданные, связывающие эти записи вместе. Большинство программ генеалогии поддерживает импорт и / или экспорт в формат GEDCOM.
Основным преимуществом использования GEDCOM является то, что вы могли бы использовать настольные программы, такие как Aldfaer (только для голландцев) , Gramps или Legacy Family Tree, а также онлайн-инструменты, такие как Geneanet, для создания или изменения вашего генеалогического древа и сравнения его с генеалогическими деревьями других ,
Еще одно важное преимущество использования формата GEDCOM заключается в том, что в вашем распоряжении имеются библиотеки на нескольких языках программирования для сохранения и загрузки ваших данных. Примерами библиотек PHP будут GEDCOM Import / Export-Filter , GenealogyGedcom или PHP GEDCOM .
Используя PHP GEDCOM, чтение и разбор GEDCOM-файла будет таким же простым, как это:
$parser = new \PhpGedcom\Parser(); $gedcom = $parser->parse('gedcom.ged');
Основным недостатком использования GEDCOM является то, что формат данных GEDCOM построен вокруг ядерной семьи, а это означает, что стандарт ограничен в поддержке нетрадиционных семейных структур, таких как однополые партнерства, смешанные семьи или совместное проживание. Хотя для поддержки такого типа связей можно расширить GEDCOM, для таких расширений ограничена возможность взаимодействия между различными программами.
Еще одним серьезным недостатком использования GEDCOM является то, что файлы GEDCOM являются монолитными. Если у вас есть набор данных из тысяч людей или вы хотите часто менять структуру данных, вы, вероятно, столкнетесь с проблемами производительности. Особенно в таких случаях лучше хранить ваши данные в базе данных. Тем не менее, это не означает, что GEDCOM бесполезен. В таких случаях вам может потребоваться использовать схему базы данных на основе формата GEDCOM, которая позволяет вам импортировать / экспортировать базу данных и формат GEDCOM. Для этого существуют и библиотеки. Пример Oxy-Gen .
Альтернативой GEDCOM будет модель данных GenTech или модель данных Gramps . Хотя они не так широко используются как стандарт GEDCOM, они могут лучше соответствовать вашим потребностям.
Если вы хотите использовать модель данных Gramps, вы можете использовать, например. экспортер Gramps PHP для экспорта ваших данных в базу данных SQLite. См. Также этот источник о том, как создать базу данных, подходящую для модели данных Gramps.