Ich kriegs nicht hin, wahrscheinlich bin ich nicht ausreichend begabt...
Ich habe so eine txt-Datei:
a|c
c|d
d|e
e|f
e|g
e|h
e|i
e|j
e|k
e|l
h|m
k|m
i|m
f|m
g|m
j|m
m|n
m|o
m|p
Die will ich auslesen und die Elemente miteinander sinnvoll verknüpfen, wobei kein Element verloren gehen darf.
Am Ende kann sowas dabei rauskommen, die Reihenfolge ist dabei aber egal, hier nur exemplarisch:
a|b
a|c
a|c|d
a|c|d|e
a|c|d|e|f
a|c|d|e|g
a|c|d|e|h
a|c|d|e|i
a|c|d|e|j
a|c|d|e|k
a|c|d|e|l
a|c|d|e|h|m
a|c|d|e|k|m
a|c|d|e|i|m
a|c|d|e|f|m
a|c|d|e|g|m
a|c|d|e|j|m
a|c|d|e|h|m|n
a|c|d|e|k|m|n
a|c|d|e|i|m|n
a|c|d|e|f|m|n
a|c|d|e|g|m|n
a|c|d|e|j|m|n
a|c|d|e|h|m|o
a|c|d|e|k|m|o
a|c|d|e|i|m|o
a|c|d|e|f|m|o
a|c|d|e|g|m|o
a|c|d|e|j|m|o
a|c|d|e|h|m|p
a|c|d|e|k|m|p
a|c|d|e|i|m|p
a|c|d|e|f|m|p
a|c|d|e|g|m|p
a|c|d|e|j|m|p
Dies ist natürlich nur exemplarisch, Die Ursprungsdatei hat 487 Zeilen...
Ich weiss mittlerweile nicht mehr, wie viele Varianten ich ausprobiert habe, hier mal eine fehlerhafte, es werden Elemente vergessen:
function cleanyOI($arr){
$File = "file1.txt";
$Handle = fopen($File, 'a');
foreach($arr as $key => $value){
$hatKinder = $this->hatKinder($value,$arr);
$hatVater = $this->hatVater($value,$arr);
if (!$hatVater && !$hatKinder){
$inlines = file($File);
if(!in_array($value,$inlines)){
fwrite($Handle, $value."\n");
echo $value;
echo "<br />";
}
unset($arr[$key]);
continue;
}
if ($hatKinder){
foreach($hatKinder as $keykinder => $valuekinder){
if(!in_array($valuekinder,$arr)){
$kindesKinder = $this->hatKinder($valuekinder,$arr);
if (!$kindesKinder){
$arr[$keykinder] = $valuekinder;
}else{
$arr[] = $valuekinder;
}
}
}
}
}
fclose($Handle);
if (count($arr)>0){
$this->cleanyOI($arr);
}
return true;
}
function trimmi($text){
$text = str_replace("\r", "", $text);
$text = str_replace("\n", "", $text);
return trim($text);
}
function hatKinder($value,$arr){
$value = $this->trimmi($value);
$links = explode('|', $value);
$linksletzteselement = $this->trimmi(array_pop($links));
$links[] = $linksletzteselement;
$kindarray = false;
foreach($arr as $rekey => $revalue){
$rechts = $this->trimmi($revalue);
$rechts = explode('|', $rechts);
$rechtsersteselement = $this->trimmi(array_shift($rechts));
if ( $rechtsersteselement === $linksletzteselement
&& $rechtsersteselement != "" && $linksletzteselement != "" ){
$kindarray[$rekey] = implode("|",array_merge($links,$rechts));
}
}
return $kindarray;
}
function hatVater($value,$arr){
$value = $this->trimmi($value);
$rechts = explode('|', $value);
$rechtsersteselement = $this->trimmi(array_shift($rechts));
$vaterarr = false;
foreach($arr as $likey => $livalue){
$livalue = $this->trimmi($livalue);
$links = explode('|', $livalue);
$linksletzteselement = $this->trimmi(array_pop($links));
$links[] = $linksletzteselement;
if ( $rechtsersteselement === $linksletzteselement
&& $rechtsersteselement != "" && $linksletzteselement != "" ){
$vaterarr[$likey] = implode("|",array_merge($links,$rechts));
}
}
return $vaterarr;
}
das ganze stoße ich so an:
$oi = new OI();
$arr = file("testfile.txt");
for ($i = 0; $i < count($arr); $i++){
$arr[$i] = $oi->trimmi($arr[$i]);
if ($arr[$i] == "")unset($arr[$i]);
}
$oi->cleanyOI($arr);
weiss hier jemand Rat? Es hängt für mich eine Menge davon ab...
Ich habe so eine txt-Datei:
a|c
c|d
d|e
e|f
e|g
e|h
e|i
e|j
e|k
e|l
h|m
k|m
i|m
f|m
g|m
j|m
m|n
m|o
m|p
Die will ich auslesen und die Elemente miteinander sinnvoll verknüpfen, wobei kein Element verloren gehen darf.
Am Ende kann sowas dabei rauskommen, die Reihenfolge ist dabei aber egal, hier nur exemplarisch:
a|b
a|c
a|c|d
a|c|d|e
a|c|d|e|f
a|c|d|e|g
a|c|d|e|h
a|c|d|e|i
a|c|d|e|j
a|c|d|e|k
a|c|d|e|l
a|c|d|e|h|m
a|c|d|e|k|m
a|c|d|e|i|m
a|c|d|e|f|m
a|c|d|e|g|m
a|c|d|e|j|m
a|c|d|e|h|m|n
a|c|d|e|k|m|n
a|c|d|e|i|m|n
a|c|d|e|f|m|n
a|c|d|e|g|m|n
a|c|d|e|j|m|n
a|c|d|e|h|m|o
a|c|d|e|k|m|o
a|c|d|e|i|m|o
a|c|d|e|f|m|o
a|c|d|e|g|m|o
a|c|d|e|j|m|o
a|c|d|e|h|m|p
a|c|d|e|k|m|p
a|c|d|e|i|m|p
a|c|d|e|f|m|p
a|c|d|e|g|m|p
a|c|d|e|j|m|p
Dies ist natürlich nur exemplarisch, Die Ursprungsdatei hat 487 Zeilen...
Ich weiss mittlerweile nicht mehr, wie viele Varianten ich ausprobiert habe, hier mal eine fehlerhafte, es werden Elemente vergessen:
function cleanyOI($arr){
$File = "file1.txt";
$Handle = fopen($File, 'a');
foreach($arr as $key => $value){
$hatKinder = $this->hatKinder($value,$arr);
$hatVater = $this->hatVater($value,$arr);
if (!$hatVater && !$hatKinder){
$inlines = file($File);
if(!in_array($value,$inlines)){
fwrite($Handle, $value."\n");
echo $value;
echo "<br />";
}
unset($arr[$key]);
continue;
}
if ($hatKinder){
foreach($hatKinder as $keykinder => $valuekinder){
if(!in_array($valuekinder,$arr)){
$kindesKinder = $this->hatKinder($valuekinder,$arr);
if (!$kindesKinder){
$arr[$keykinder] = $valuekinder;
}else{
$arr[] = $valuekinder;
}
}
}
}
}
fclose($Handle);
if (count($arr)>0){
$this->cleanyOI($arr);
}
return true;
}
function trimmi($text){
$text = str_replace("\r", "", $text);
$text = str_replace("\n", "", $text);
return trim($text);
}
function hatKinder($value,$arr){
$value = $this->trimmi($value);
$links = explode('|', $value);
$linksletzteselement = $this->trimmi(array_pop($links));
$links[] = $linksletzteselement;
$kindarray = false;
foreach($arr as $rekey => $revalue){
$rechts = $this->trimmi($revalue);
$rechts = explode('|', $rechts);
$rechtsersteselement = $this->trimmi(array_shift($rechts));
if ( $rechtsersteselement === $linksletzteselement
&& $rechtsersteselement != "" && $linksletzteselement != "" ){
$kindarray[$rekey] = implode("|",array_merge($links,$rechts));
}
}
return $kindarray;
}
function hatVater($value,$arr){
$value = $this->trimmi($value);
$rechts = explode('|', $value);
$rechtsersteselement = $this->trimmi(array_shift($rechts));
$vaterarr = false;
foreach($arr as $likey => $livalue){
$livalue = $this->trimmi($livalue);
$links = explode('|', $livalue);
$linksletzteselement = $this->trimmi(array_pop($links));
$links[] = $linksletzteselement;
if ( $rechtsersteselement === $linksletzteselement
&& $rechtsersteselement != "" && $linksletzteselement != "" ){
$vaterarr[$likey] = implode("|",array_merge($links,$rechts));
}
}
return $vaterarr;
}
das ganze stoße ich so an:
$oi = new OI();
$arr = file("testfile.txt");
for ($i = 0; $i < count($arr); $i++){
$arr[$i] = $oi->trimmi($arr[$i]);
if ($arr[$i] == "")unset($arr[$i]);
}
$oi->cleanyOI($arr);
weiss hier jemand Rat? Es hängt für mich eine Menge davon ab...
Kommentar