Hallo,
ich habe versucht, den Code auf das Wichtigste zu kürzen:
CODE $text=file_get_contents("$datei");
$text=str_replace("\r","\n",$text);
$zeilenanzahl=substr_count($text,"\n");
$textneu=explode("\n", $text);
for($i=0; $i<=$zeilenanzahl;$i++)
{
$neuereintrag="";
$textzeile=$textneu[$i];
$textzeile=trim($textzeile);
if($textzeile[0]=="0")
{
if(strpos($textzeile,"@")<>0 and strpos($textzeile,"INDI")>0){$eintrag="person";}
if(strpos($textzeile,"@")<>0 and strpos($textzeile,"FAM")>0){$eintrag="familie";}
if(strpos($textzeile,"@")==0 and strpos($textzeile,"TRLR")>0){echo "<div class=\"abfolge\">Übertragung erfolgreich abgeschlossen.<p>Solange Sie Verknüpfungen nicht ändern, können alle gerade eingefügten Vorfahren wieder gelöscht werden. <a href=\"/$n1/login/sbearbeiten.html\" target=\"_top\">Aktualisieren</a></div>";die;}
while($neuereintrag<>"ja")
{
$zahl=$zahl+1;
$textzeile=$textneu[$zahl];
$textzeile=trim($textzeile);
$teiletext=explode(" ",$textzeile);
if($teiletext[0]=="0")
{
$textzeile=explode("@", $textzeile);
$neuepersontext="$textzeile[1]";
if($eintrag=="person")
{
$datum=$datum+1;
$text=ereg_replace("$textzeile[1]", "$datum", $text);
$textneu=explode("\n", $text);
}
}
else
{
if($eintrag=="person")
{
$felder1=" NAME SOUR RELI SEX NOTE DATE OCCU BIRT CHR DEAT BURI";
$felder2=" DATE PLAC";
if($teiletext[0]=="1")
{
if($teiletext[1]=="NAME")
{
$name=substr($textzeile,6);
$name=explode("/", $name);
$name[0]=trim($name[0]);
$name[1]=trim($name[1]);
$name[2]=trim($name[2]);
if(empty($name[2]))
{
$vorname=$name[0]; $nachname=$name[1];
}
else
{
$vorname=$name[2]; $nachname=$name[1];
}
}
if($teiletext[1]=="SOUR"){$quellen=substr($textzeile,6);}
if($teiletext[1]=="RELI"){$religion=substr($textzeile,6);}
if(strpos($felder1,$teiletext[1])>0)
{
$kategorie=$teiletext[1];
}
else
{
$gedcominfo="$gedcominfo\n$textzeile";
}
}
if($teiletext[0]=="2")
{
if($kategorie=="NOTE" and $teiletext[1]=="CONT"){$weitereinfo=substr($textzeile,6); $informationen="$informationen $weitereinfo";}
if($kategorie=="BIRT" and $teiletext[1]=="DATE"){$geburtsdatum=substr($textzeile,6);}
if(strpos($felder2,$teiletext[1])==0)
{
$gedcominfo="$gedcominfo\n1 $kategorie\n$textzeile";
}
}
}
if($eintrag=="familie")
{
$felder1=" HUSB WIFE CHIL MARR";
$felder2=" DATE PLAC";
if($teiletext[0]=="1")
{
if($teiletext[1]=="HUSB"){$ehemann=explode("@", $textzeile); $ehemann="$ehemann[1]";}
if($teiletext[1]=="WIFE"){$ehefrau=explode("@", $textzeile); $ehefrau="$ehefrau[1]";}
if($teiletext[1]=="CHIL"){$kind=explode("@", $textzeile); $kinder="$kinder\{$kind[1]}";}
if($teiletext[1]=="MARR"){$heirat=substr($textzeile,6);}
if(strpos($felder1,$teiletext[1])>0)
{
$kategorie=$teiletext[1];
}
else
{
$gedcominfo="$gedcominfo<br>$textzeile";
}
}
if($teiletext[0]=="2")
{
if($kategorie=="MARR" and $teiletext[1]=="DATE"){$heiratsdatum=substr($textzeile,6);}
if($kategorie=="MARR" and $teiletext[1]=="PLAC"){$heiratsort=substr($textzeile,6);}
if(strpos($felder2,$teiletext[1])==0)
{
$gedcominfo="$gedcominfo\n1 $kategorie\n$textzeile";
}
}
}
}
$textzeileneu=$textneu[$zahl+1];
if($textzeileneu[0]=="0")
{
$neuereintrag="ja";
}
}
if($eintrag=="person")
{
############################
### Neue Person einfügen ###
############################
}
if($eintrag=="familie")
{
##############################
### Verknüpfungen einfügen ###
##############################
}
}
}
Übrigens besitzt die einzufügende Datei beinahe 15000 Zeilen.
Es geht um das Einfügen von einer GEDCOM-Datei (für Ahnenforschung). Pro Zeile steht eine Informationen. Fängt eine Zeile mit 0 an wird zum Beispiel ein neuer Vorfahre angefangen, 1 und 2 etc. beziehen sich dann darauf.
Die Schleife geht meiner Meinung nach nicht kleiner.
Was mir jetzt aber noch als Idee aufgekommen ist (über Nacht): Er soll einfach nur die ersten 1000 Zeilen abarbeiten und dann lädt er per Location-Befehl die gleiche Datei, allerdings fängt er jetzt bei Zeile 1000 an zu arbeiten. Damit würde das Abarbeiten sozusagen kurz unterbrochen werden und der Server dürfte es nicht als Endlosschleife interpretieren. Oder?
Friedrich