arrays performat(er) abgleichen

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

  • arrays performat(er) abgleichen

    hi,
    ich habe 2 arrays, die für eine suchen/ersetzen-aktion abgeglichen werden müssen.
    hintergrund => str_replace versteht keine assoz. arrays.

    da ich bei den array-funktionen nichts gescheites gefunden habe, hab ich
    mir nen würgaround gebastelt:
    PHP-Code:
    /*
    Array_content
    (
        [titel] => Der Titel
        [subhead] => Ein Untertitel
        [text] => Hier steht ganz viel blabla blubb
        [schrott] => muelleingabe
        [abc] => hfdkdsfhdkshkh
        [bild] => bild
        [kaese] => kaese
        [wurst] => wurst
    )
    Array_tplsearch
    (
        [titel] => {titel}
        [subhead] => {subhead}
        [bild] => {bild}
        [kaese] => {kaese}
        [text] => {text}
        [wurst] => {wurst}
    )
    */
            
    $tpl_keys array_keys($tplsearch);
            
    $con_keys array_keys($content);
            
    $arrdiv array_diff($con_keys,$tpl_keys);
          
            if(
    count($arrdiv) > 0)
            {
                foreach(
    $arrdiv as $val)
                {
                    unset(
    $content[$val]);
                }
            }
            
    ksort($content);
            
    ksort($tplsearch); 
    das läuft auf nem schnellen rechner sehr zügig > 0,1 ms ... allerdings wird
    dieser ablauf innerhalb des scriptes mehrfach wiederholt (10-15x) ... das
    läppert sich also ... deshalb die frage: geht das auch schneller, besser,
    eleganter?

    thx
    Kissolino.com

  • #2
    PHP-Code:
    function clean($value$key, &$walk)
    {
      if (!
    array_key_exists($key$walk[0]))
          unset(
    $walk[1][$key]);        
    }

    $tpl=array("a" => "green""b" => "brown""c" => "blue"'d' =>"red");
    $content=array("a" => "green2"'farbe' =>"yellow"'d' => "schinken""test" => 213);
    $to_use=array_intersect(array_keys($content), array_keys($tpl));
    $to_use=array_flip($to_use);

    print_r($tpl);
    print_r($content);

    $walk=array(&$to_use, &$content);
    array_walk($content'clean'$walk);

    print_r($content); 
    so?
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      Hi Wurzel,

      im Array kannst Du kaum knaubern.
      array_diff ist eine effiziente Methode (O(1) - Subtraktionsmethode).
      Während das Löschen
      (n+1)²-n² = 2n+1 -> O(n)
      mit der Länge n immer langsamer wird.

      Zum Rest kann ich nichts sagen.
      Kenne Aufruf nicht.

      cu

      Blaster
      Yuppi, endlich Elite ...

      Kommentar


      • #4
        sorry happy, clean() ist in meiner klasse nicht erreichbar.
        bau ich das ganze um, ist es langsamer als mein weg ...

        andere ideen?
        Kissolino.com

        Kommentar


        • #5
          @blaster
          das ganze ist bestandteil meiner template-class

          ich versuche möglichst effizient/performant und so flexibel wie es
          geht blöcke mit inhalt zu füllen

          daraus ergeben sich 2 arrays
          1. content => db-inhalt
          2. template-platzhalter => datei.tpl

          die arrays sind assoziativ und können unterschiedlich sein ... um den
          grundsätzlichen vergleich komm wahrscheinlich ich nicht herum ... ich hatte nur die hoffnung, es gäbe was besseres.
          Kissolino.com

          Kommentar


          • #6
            PHP-Code:
            $to_use=array_intersect(array_flip($content), array_flip($tpl));
            $to_use=array_flip($to_use); 
            aber das geht nur, wenn kein wert in einem array doppelt vorkommt
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              @Wurzel:
              Bei meinen letzten Projekt hatte ich das so gelöst:
              1 set => 1 tpl
              und da je nach Content-Entitäten die tpl-Haupt- und Sub-Kategorien
              per if-case ein oder ausblenden (Baumstruktur). Set und tpl waren eine Einheit (PAC- Patterns). if-cases sind verdammt schnell...
              Und das waren immerhin schlappe 450 Entitäten mit dynamischen Navigationsverhalten.
              Aufruf der meterlangen Gesamtübersicht unter 1s.

              Trival...
              Yuppi, endlich Elite ...

              Kommentar


              • #8
                @happy
                super idee, doppelt so schnell wie meins ^^ das mit den doppelten werten
                im value müsste ich ausschliessen können

                @blaster
                Original geschrieben von Blaster
                @Wurzel:
                Bei meinen letzten Projekt hatte ich das so gelöst:
                1 set => 1 tpl
                und da je nach Content-Entitäten die tpl-Haupt- und Sub-Kategorien
                per if-case ein oder ausblenden (Baumstruktur). Set und tpl waren eine Einheit (PAC- Patterns). if-cases sind verdammt schnell...
                Und das waren immerhin schlappe 450 Entitäten mit dynamischen Navigationsverhalten.
                Aufruf der meterlangen Gesamtübersicht unter 1s.

                Trival...
                rembrandt ...
                sorry. ... versteh grad den zusammenhang nicht.
                Kissolino.com

                Kommentar

                Lädt...
                X