Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
arrays performat(er) abgleichen [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
arrays performat(er) abgleichen


 
Wurzel
27-12-2003, 20:18 
 
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:/*
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

 
mrhappiness
27-12-2003, 21:14 
 
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?

 
Blaster
27-12-2003, 21:16 
 
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

 
Wurzel
27-12-2003, 21:35 
 
sorry happy, clean() ist in meiner klasse nicht erreichbar.
bau ich das ganze um, ist es langsamer als mein weg ... :dontknow:

andere ideen?

 
Wurzel
27-12-2003, 21:43 
 
@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.

 
mrhappiness
27-12-2003, 22:07 
 
$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

 
Blaster
27-12-2003, 22:12 
 
@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...

 
Wurzel
27-12-2003, 22:26 
 
@happy
super idee, doppelt so schnell wie meins ^^ das mit den doppelten werten
im value müsste ich ausschliessen können :grin:

@blasterOriginal 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 ... :confused:
sorry. ... versteh grad den zusammenhang nicht.

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 14:42 Uhr.