Verknüpfung Eltern Kind Elemente

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Verknüpfung Eltern Kind Elemente

    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...

  • #2
    Benutz bitte PHP-Tags obwohl ich auch dann bezweifel, dass ich jmd. den elend langen Code anguckt.

    Ich denke, ich würde die Paare einlesen in ein Array und dann via Rekursion diese Ketten ermitteln, wobei man darauf achten sollte, dass bei Array(key) => value value > key ist, wenn du die Buchstaben umwandelst in Ascii-Werte.. falls die Paare nicht so geordnet sind

    mfg

    Kommentar


    • #3
      hmmm, hast ja recht, aber ganz ohne code nen Problem hier posten?

      Habe ein Problem genau mit der Rekursion. Ich habs nicht geregelt bekommen bislang, bin total am verzweifeln....

      Kommentar


      • #4
        Solang die Reihenfolge egal ist:

        Einlesen in ein Array mit $key => $value .. wobei ord($key) < chr($value)

        Dann Rekursion: Parameter: Buchstabe + String
        Anfang: Buchstabe = a , String = ''
        Schleife alle Elemente mit $key = a ausgeben und an Rekursion($value,$momentanerString) weitergebn ..
        schleife beenden
        funktion beenden

        sollte schon reichen

        Kommentar


        • #5
          Danke, das werde ich mal nachher probieren, Quelltext dann posten wenns sauber durchgeht, falls es noch jemand anders mal brauchen kann

          Kommentar


          • #6
            bestimmt!

            php-Entwicklung | ebiz-consult.de
            PHP-Webhosting für PHP Entwickler | ebiz-webhosting.de
            die PHP Marktplatz-Software | ebiz-trader.de

            Kommentar

            Lädt...
            X