php递归函数用于家谱树



我在数据库中有与父母有关系的人,我需要创建递归函数,该函数返回带有家谱树的数组。数据库示例:

NUMBER;NAME;FATHER;MOTHER
001;Name1;002;005
002;Name2;007;018
003;Name3;018;025
005;Name5;006;019
023;Name23;019;045
018;Name18;062;097
007;Name7;;-
...

我准备了两个函数——第一个用于man细节,第二个用于搜索祖先的递归函数。

我需要这个结果:

$out[0][0] // first person
$out[1][0] // mother of first person
$out[1][1] // father of first person
$out[2][0] // grandmother of first person (mother side)
$out[2][1] // grandfather of first person (mother side)
$out[2][2] // grandmother of first person (father side)
$out[2][3] // grandmother of first person (father side)
...

下一代有8个项目,接下来有16个项目。。。最多可追溯6代。

我准备了两个函数——第一个用于man细节,第二个用于树构建的递归函数。在第二个功能

define("MAX_GEN",5);
function detail($number) {
$d = mysql_query("select * from table where number = '$number'");
if(mysql_num_rows($d) == 0) {
$p[name] = "N/A";
$p[number] = "N/A";
$p[m_number] = "N/A";
$p[f_number] = "N/A";
}
else $p = mysql_fetch_assoc($d);
return $p;
}
function gen($number, $generation = 0, $out) {
if ($generation >= MAX_GEN) {
return false;
}
$record = detail($number);
if ($generation == 0) $out[0][] = $record; // first man
$generation++; // next generation
if (!$out[$generation] && ($generation != MAX_GEN)) $out[$generation] = array();
$x_mother = gen($record[m_number], $generation ); // continue with mother
$x_father = gen($record[f_number], $generation ); // continue with father
if ($out[$generation]) {
$out[$generation][] = $x_mother;
$out[$generation][] = $x_father;
}
return $out;
}

但在第二个函数中存在问题——我不知道如何将数组和结果传递给下一代和下一代。它仍然返回一个元素,或者(在几次尝试后(返回我想要的数组,但在生成之间插入了数组,结果不可用。有人能帮我吗?

我想要的结果示例如下:http://www.foxterrier.cz/_TM_importy/example.php

这主要是一条注释,但有点长。

数据库设计和期望的输出格式都会对您造成很大的限制。即使不考虑图数据库的成本/复杂性,在关系数据库中也有很多表示层次数据的方法。

你的输出格式列出了每一代人,但不维护父母的联系,也不适合横向或向前绘制,只适合向后绘制。

您的实现需要运行2^N(其中N是生成数(查询,每次都要从PHP代码向DBMS进行四舍五入。表现会很糟糕。

作为最低要求,您应该考虑一次解决一代:

$ref=mysql_real_escape_string(session_id());
mysql_query(
"INSERT INTO results (generation, number, ref) VALUES (0, $start_number, '$ref')"
);
for ($x=1; $x<=max_gens; $x++) {
mysql_query(
"INSERT INTO results (generation, number, ref)
SELECT $x, father, '$ref'
FROM yourtable yt JOIN results rs ON yt.number=results.number 
WHERE rs.generation=$x-1
UNION 
SELECT $x, mother, '$ref'
FROM yourtable yt JOIN results rs ON yt.number=results.number 
WHERE rs.generation=$x-1"
);
}

(但需要更多的错误检查-记住稍后清除数据(

更新了essam eg的解决方案-现在已完全工作:
-在MAX_GET之前先删除char$,用于循环
-在循环中删除$generation($i足够(
–在中添加调用详细信息($out[$i][]=$record[m_number];->$out[$si][]=详细信息($record[m.number]((
-修改将父亲添加到数组(母亲被旋转,父亲失踪(

define("MAX_GEN",5);
function detail($number) {
$d = mysql_query("select * from table where number = '$number'");
if(mysql_num_rows($d) == 0) {
$p[name] = "N/A";
$p[number] = "N/A";
$p[m_number] = "N/A";
$p[f_number] = "N/A";
}
else $p = mysql_fetch_assoc($d);
return $p;
}
$main_person_number=001;//number in database
$out[0][] =detail($number);// main person

for($i=1;$i<MAX_GEN;$i++){
$parent=$i-1;
for($j=0;$j<pow(2,$parent);$j++){
$record = detail($out[$parent][$j]['number']);
$out[$i][] = detail($record[m_number]);
$out[$i][] = detail($record[f_number]);
}
}

我更喜欢使用迭代来创建$out数组

代替gen功能

迭代次数增加1->2->4->8

=2^($generation-1(

$parent=$generation-1;
for($j=0;$j<pow(2,$parent);$j++){

全代码

define("MAX_GEN",5);
function detail($number) {
$d = mysql_query("select * from table where number = '$number'");
if(mysql_num_rows($d) == 0) {
$p[name] = "N/A";
$p[number] = "N/A";
$p[m_number] = "N/A";
$p[f_number] = "N/A";
}
else $p = mysql_fetch_assoc($d);
return $p;
}
$main_person_number=001;//number in database
$generation = 0;
$out[0][] =detail($number);// main person
$generation++; // next generation
for($i=1;$i<$MAX_GEN;$i++){
$parent=$generation-1;
for($j=0;$j<pow(2,$parent);$j++){
$record = detail($out[$parent][$j]['number']);
$out[$generation][] =$record[m_number];
$out[$generation][] =$record[m_number];
}
$generation++;   
}

相关内容

  • 没有找到相关文章

最新更新