anpera.net
http://anpera.homeip.net/phpbb3/

Funktionssammlung
http://anpera.homeip.net/phpbb3/viewtopic.php?f=43&t=3352
Seite 2 von 2

Autor:  MySql [ Sa 19 Jun, 2010 19:03 ]
Betreff des Beitrags:  Re: Funktionssammlung

print_array()
Die Funktion print_array gibt das angegebene Array wieder.
$this->bbcode_second_pass_code('', '/**
* print_array by MySQL
**/
function print_array( $arr, $print_lvl = false ) {

global $output;

if( !is_array($arr) ) {

$str_out = 'Der angegebene Wert ist kein Array!';

} else {

$level = $print_lvl === 0 ? 0 : 4;

$str_out .= '`@Array<br />'. str_pad('', ($print_lvl * 4) + ($print_lvl * $level), ' ') .'(`0<br />';

foreach( $arr as $key => $val ) {

if( is_array($val) ) {

$str_out .= str_pad('', ($print_lvl * 4) + ($print_lvl * $level), ' ');
$str_out .= ' `)[`0`^'.$key.'`)]`0 => '.print_array($val, $print_lvl + 1);

} else {

if( is_numeric($val) ) {

$color = '`9';
$end = '`0';

} else {

$color = '`$\'`g';
$end = '`$\'';

}

$str_out .= str_pad('', ($print_lvl * 4) + ($print_lvl * $level), ' ');
$str_out .= ' `)[`0`^'.$key.'`)]`0 => '.$color.$val.$end.'<br />';

}

}

$str_out .= str_pad('', ($print_lvl * 4) + ($print_lvl * $level), ' ');
$str_out .= '`@)`0<br />';

}

return $str_out;

}')

Mittel pre (<pre>input</pre>) wird das Array lesbar!

Ein Beispiel:


$this->bbcode_second_pass_code('', '$book_template = array(
'Book_Status' => 'Deaktiviert',
'Book_Author' => 'Username',
'Book_Update' => 0,
'Book_Title' => 'Titel des Buches',
'Book_Category' => 'Kategorie des Buches',
'Book_Operator' => 'Bearbeiter des Buches. (Mind. Mod oder Bücherreichmeister)',
'Book_Experience' => array('True' => true,'Experience' => 100, 'Ok' => array('Ok!')),
'Book_Text' => 'Text');
output('<pre>'.print_array($book_template).'</pre>',true);')

Ausgabe:

$this->bbcode_second_pass_code('', 'Array
(
[Book_Status] => 'Deaktiviert'
[Book_Author] => 'Username'
[Book_Update] => 0
[Book_Title] => 'Titel des Buches'
[Book_Category] => 'Kategorie des Buches'
[Book_Operator] => 'Bearbeiter des Buches. (Mind. Mod oder Bücherreichmeister)'
[Book_Experience] => Array
(
[True] => '1'
[Experience] => 100
[Ok] => Array
(
[0] => 'Ok!'
)
)
[Book_Text] => 'Text'
)')

Autor:  -DoM [ Mo 21 Jun, 2010 16:35 ]
Betreff des Beitrags:  Re: Funktionssammlung

Für alle die sich den Einbau sparen möchten: dump_item()
Eine Funktion die bereits vorhanden ist und das selbe macht.
Siehe LoGD 0.9.7 Ger3:
$this->bbcode_second_pass_code('', 'function dump_item($item){
$output = '';
if (is_array($item)) $temp = $item;
else $temp = unserialize($item);
if (is_array($temp)) {
$output .= "array(" . count($temp) . ") {<blockquote>";
while(list($key, $val) = @each($temp)) {
$output .= "'$key' = '" . dump_item($val) . "'`n";
}
$output .= "</blockquote>}";
} else {
$output .= $item;
}
return $output;
}')

Autor:  Harthas [ Mi 23 Jun, 2010 08:34 ]
Betreff des Beitrags:  Re: Funktionssammlung

Wenn wir schon dabei sind, auf bereits existierendes hinzuweisen:
Für die meisten sollten var_export mit $return-Paramter auf true genügen.

Autor:  -DoM [ Mi 23 Jun, 2010 09:22 ]
Betreff des Beitrags:  Re: Funktionssammlung

Wenn man ein etwas seltsames Ergebnis bevorzugt sollte man das machen...;-)
In der Theorie mag var_export() funktionieren, aber in der Praxis kommt ein nicht sonderlich schönes Ergebnis, siehe Beispiel:

Beispiel:
$this->bbcode_second_pass_code('', '
$var = array('Lasagne'=>'Lecker', 'Spinat'=>'Brrrrr', 'Pizza'=>array('Thunfisch','Artischocken','Zwiebeln'), 'Zwieback'=>'Trocken');
echo var_export($var);
//Ausgabe
//array ( 'Lasagne' => 'Lecker', 'Spinat' => 'Brrrrr', 'Pizza' => array ( 0 => 'Thunfisch', 1 => 'Artischocken', 2 => 'Zwiebeln', ), 'Zwieback' => 'Trocken', )
')
Man achte auf das letzte Komma! Ich frage mich woher er das nimmt? Auch geht jede Formatierung flöten, da die Funktion mit einfachen "\n" und " " (Leerzeichen), versucht zu formatieren. Es ist also kontraproduktiv, dies für eine HTML-Ausgabe zu nutzen, es sei denn man ersetzt die vermeindlichen Formatierungszeichen.

Um dem ganzen hier aber noch ein wenig Sinn zu geben, hier ein funktionierendes Beispiel:
$this->bbcode_second_pass_code('', '
$var = array('Lasagne'=>'Lecker', 'Spinat'=>'Brrrrr', 'Pizza'=>array('Thunfisch','Artischocken','Zwiebeln'), 'Zwieback'=>'Trocken');
echo '<pre>';
print_r($var);
echo '</pre>';

/*Ausgabe:
Array
(
[Lasagne] => Lecker
[Spinat] => Brrrrr
[Pizza] => Array
(
[0] => Thunfisch
[1] => Artischocken
[2] => Zwiebeln
)

[Zwieback] => Trocken
)
*/
')

Autor:  Eliwood [ Fr 25 Jun, 2010 21:09 ]
Betreff des Beitrags:  Re: Funktionssammlung

Warum diskriminiert hier eigentlich jeder print_r() mit seinem hübschen zweiten Parameter $return, den man auf true setzen kann?

@Dom: Das Komma kommt vermutlich vom Code-Sparen - intressanterweise kann man in PHP Komma sowieso immer zusätzlich einsetzen, es ist also nicht mal falsch.

Autor:  Drazaar [ Do 08 Jul, 2010 23:22 ]
Betreff des Beitrags:  Re: Funktionssammlung

Zitat:
Wer seine Funktionen (Und nur Funktionen!) hier hineinposten möchte: Nur zu.


array_delete()

$this->bbcode_second_pass_code('', 'function array_delete() {
$args = func_get_args();
$n = func_num_args();

if(!is_array($args[0]))
die('Erstes Element in array_delete() nicht vom Typ Array!!');
else {
$my_array = $args[0];
$delete_array = array();

for($i=1; $i<$n; $i++) {
if(is_array($args[$i])) {
foreach($args[$i] AS $var) {
$delete_array[] = $var;
}
}
else {
$delete_array[] = $args[$i];
}
}
return array_diff($my_array, $delete_array);
}
}')

Ok, wie funzt das Ding:

$this->bbcode_second_pass_code('', '$arr1 = array(Banane, Zitrone, Kiwi, Apfel, Birne);

$magichnicht = array(Zitrone, Birne);

$ganzbesondersnicht = 'Kiwi';

$ichbingarnichtdabei = 'Pflaume';

$new_arr = array_delete($arr1, $magichnicht, $ganzbesondersnicht, $ichbingarnichtdabei);

// $new_arr beinhaltet nun Banane und Apfel. Pflaume wird nicht beachtet.
')

Wie man also sieht kann $arg1, $arg2, $arg3, etc. vom Typ array oder string sein. $arg0 muss das Array sein, aus welchem die Elemente gelöscht werden sollen.

Ich denke die Funktion erklärt sich von alleine, manchmal kann sie ganz hilfreich sein. Ich kenne keine andere Lösung um bestimmte Elemente aus einem Array zu löschen, wenn man ihre Position nicht kennt. Wenn es einen einfacheren Weg gibt (was wohl der Fall ist, weil es das immer gibt xD), dann darf man ihn mir ruhig mitteilen.

LG Draz


PS: Bevor ich es vergesse: Die Arrayschlüssel bleiben unverändert. Heißt, dass im obigen Beispiel das Array folgendermaßen aussähe: array(0 => "Banane", 3 => "Apfel");

Autor:  Bathory [ Fr 09 Jul, 2010 15:16 ]
Betreff des Beitrags:  Re: Funktionssammlung

Drazaar hat geschrieben:
Ich denke die Funktion erklärt sich von alleine, manchmal kann sie ganz hilfreich sein. Ich kenne keine andere Lösung um bestimmte Elemente aus einem Array zu löschen, wenn man ihre Position nicht kennt. Wenn es einen einfacheren Weg gibt (was wohl der Fall ist, weil es das immer gibt xD), dann darf man ihn mir ruhig mitteilen.

PS: Bevor ich es vergesse: Die Arrayschlüssel bleiben unverändert. Heißt, dass im obigen Beispiel das Array folgendermaßen aussähe: array(0 => "Banane", 3 => "Apfel");


Ich kann dir wirklich nur empfehlen dich mit den basics (dazu zählen array standard Funktionen) auseinanderzusetzen!

$this->bbcode_second_pass_code('', '$new_arr = array_diff($arr1, $magichnicht, (array)$ganzbesondersnicht, (array)$ichbingarnichtdabei);')

Liefert das gleiche Ergebnis.

Da array_diff keine Strings akzeptiert ist hier ein typecast nötig, aber immer noch einfacher, als ne unnötige Funktion.

LG,
Bathi

p.s. solltest du die keys ordnen wollen guck dir http://www.php.net/array_values an.

Autor:  Drazaar [ Fr 09 Jul, 2010 15:20 ]
Betreff des Beitrags:  Re: Funktionssammlung

Hi,

ich kann dir wirklich nur empfehlen, die Funktionen die ein User hier posted, auch einmal anzuschauen. ;)

array_delete überprüft ob es sich beim Argument 1-x um einen String oder ein Array handelt. WEnn es sich um ein Array handelt, werden alle Arrayelemente zu $delete_array hinzugefügt. Ein einzelner String wird genau so zu diesem Array hinzugefügt. Am Ende wird array_diff eben mit dem Ausgangsarray und dem array $delete_array gefüttert. Es handelt sich somit bei beiden Argumenten zwangsweise immer um ein Array...

Autor:  Bathory [ Fr 09 Jul, 2010 15:25 ]
Betreff des Beitrags:  Re: Funktionssammlung

Drazaar hat geschrieben:
ich kann dir wirklich nur empfehlen, die Funktionen die ein User hier posted, auch einmal anzuschauen. ;)


Ich habe sie mir angeguckt und als nutzlos erklärt.

Wie gesagt reicht hier ein Typecast....

$this->bbcode_second_pass_code('', '$new_arr = array_diff($arr1, $magichnicht, (array)$ganzbesondersnicht, (array)$ichbingarnichtdabei);')

liefert das gleiche Ergebnis wie bei dir:

$this->bbcode_second_pass_code('', '
$new_arr = array_delete($arr1, $magichnicht, $ganzbesondersnicht, $ichbingarnichtdabei);
')


Nur das man sich den Overhead einer extra Funktion spart inkl array iteration + vergleiche is_array + speicher für ein extra array und und und...

Autor:  Drazaar [ Sa 10 Jul, 2010 16:00 ]
Betreff des Beitrags:  Re: Funktionssammlung

Ich seh eigentlich keinen Grund mich zu rechtfertigen, aber so vielmal vorweg:
Ich habe die Funktion gemacht, weil ich es als recht nützlich in LoGD empfand, bestimmte Elemente aus einem Array zu löschen.
Da du hier irgendwas von einem Typecast rumlaberst ist ok, ich habe es verstanden. Allerdings habe ich es in Fällen angewandt, da wäre das nicht so locker flocker gegangen mit einmal (array) davorsetzen. Im Endeffekt sieht es doch so aus:
Du musst die Funktion nicht nutzen, also ist ja alles i.O.

Und eigentlich ist der Thread auch überhaupt nicht für Diskussioen / Feedback gedacht.

Autor:  Bathory [ Sa 10 Jul, 2010 17:43 ]
Betreff des Beitrags:  Re: Funktionssammlung

Drazaar hat geschrieben:
Ich seh eigentlich keinen Grund mich zu rechtfertigen, aber so vielmal vorweg:
Ich habe die Funktion gemacht, weil ich es als recht nützlich in LoGD empfand, bestimmte Elemente aus einem Array zu löschen.
Da du hier irgendwas von einem Typecast rumlaberst ist ok, ich habe es verstanden. Allerdings habe ich es in Fällen angewandt, da wäre das nicht so locker flocker gegangen mit einmal (array) davorsetzen. Im Endeffekt sieht es doch so aus:
Du musst die Funktion nicht nutzen, also ist ja alles i.O.

Und eigentlich ist der Thread auch überhaupt nicht für Diskussioen / Feedback gedacht.


Ich versteh dein Verhalten nicht, ich bin nur deinem Wunsch nachgekommen! :dumm:

Drazaar hat geschrieben:
Ich kenne keine andere Lösung um bestimmte Elemente aus einem Array zu löschen, wenn man ihre Position nicht kennt. Wenn es einen einfacheren Weg gibt (was wohl der Fall ist, weil es das immer gibt xD), dann darf man ihn mir ruhig mitteilen.


Ich mein wenn du nichts neues lernen willst dann sag es doch das nächste Mal direkt!

Ausserdem:

Drazaar hat geschrieben:
Allerdings habe ich es in Fällen angewandt, da wäre das nicht so locker flocker gegangen mit einmal (array) davorsetzen.


Da ich nicht dumm sterben will nenn mir einen einzigen Fall, wo das mit nem Typecast (array) + array_diff nicht funktionieren sollte, aber mit deiner Funktion schon...

Autor:  MySql [ Sa 10 Jul, 2010 22:20 ]
Betreff des Beitrags:  Re: Funktionssammlung

Das artet langsam zu einer privaten Diskussion aus. Bitte klärt das privat per PN. - Wir müssen hier nicht unbedingt mit Dreck werfen.

Daher das Thema auch eigentlich nur auf Funktionen ausgelegt ist..

Autor:  Bathory [ Sa 10 Jul, 2010 22:31 ]
Betreff des Beitrags:  Re: Funktionssammlung

MySql hat geschrieben:
Das artet langsam zu einer privaten Diskussion aus. Bitte klärt das privat per PN. - Wir müssen hier nicht unbedingt mit Dreck werfen.

Daher das Thema auch eigentlich nur auf Funktionen ausgelegt ist..


Ich werfe hier nicht mit Dreck. :warn:

Und eine Funktionssammlung sollte Sinn ergeben.
Als Vorschlag => Sticky und geclosed Thread wo ein Mod nach Kontrolle sinnvolle Funktionen reinpostet.

Autor:  MySql [ Mo 06 Feb, 2012 17:57 ]
Betreff des Beitrags:  Re: Funktionssammlung

addComponent
Funktion der Klasse Factory - Läd, sofern Datei und Klasse vorhanden, eine Klasse.

$this->bbcode_second_pass_code('', 'class Factory {

const Dir = 'library';
private $components = array();

public function addComponent() {

$num = func_num_args();
$args = func_get_args();

if( preg_match('/\./', $args[0]) == true ) {

$exp = explode('.', $args[0]);
$count = count($exp);

if( $count > 0 ) {

for( $i=0; $i < $count; $i++ ) {

$path .= '/'.$exp[$i];

}

$path .= '.php';
$comp = $exp[$count-1];

} else {

$path = '/'.$exp[0].'.php';
$comp = $exp[0];

}

} else {

$path = '/'.$args[0].'.php';
$comp = $args[0];

}

if( !file_exists(Factory::Dir.$path) ) {

return ;

} else {

if( array_key_exists($comp, $this->components) ) {

return;

} else {

require_once Factory::Dir.$path;

if( !class_exists($comp) ) {

return;

} else {

unset($args[0]);
$requiredClass = new ReflectionClass($comp);
$class = $requiredClass->newInstanceArgs($args);

return $class;

}

$this->components[$comp] = true;

}

}

}

}')

Nutzung:

$this->bbcode_second_pass_code('', '$Factory = new Factory;

# Laden der Klasse "System"
$System = $Factory->addComponent('System');
# Die Klasse "System" hat Argumente? Dann so:
$System = $Factory->addComponent('System','Arg1','Arg2'); #etc.
# Die Klasse "System" liegt in einem weiterem Unterordner? Dann so:
$System = $Factory->addComponent('System.System', [, mixed $args ]);

# Die Klasse kann allerdings nicht doppelt geladen oder instanziert werden.
$System = $Factory->addComponent('System');
$System = $Factory->addComponent('System'); # Führt ins leere, erzeugt keinen Fehlercode.')

Dazu sei gesagt dass die Datei und die Klasse den gleichen Namen tragen müssen.

Vielleicht braucht es wer, vielleicht auch nicht. Es staubte hier einfach noch vor sich her. :nene:

My.

Edit: Danke an Hartas der mich auf die Kern-Class ReflectionClass aufmerksam gemacht hat.
Update: Argumenten Schnittstelle bearbeitet und verbessert.

Autor:  MySql [ Di 07 Feb, 2012 21:43 ]
Betreff des Beitrags:  Re: Funktionssammlung

db_unbuffered_query()
Äquivalent zu mysql_unbuffered_query.

$this->bbcode_second_pass_code('', 'function db_unbuffered_query($sql) {

global $session, $dbqueriesthishit, $dbtimethishit;

$dbqueriesthishit++;
$dbtimethishit -= getmicrotime();

$func = DBTYPE.'_unbuffered_query';

$r = $func($sql) or die(($session['user']['superuser'] >= 3 || 1 ? '<pre>'.HTMLEntities($sql).'</pre>':'').db_error(LINK));

$dbtimethishit += getmicrotime();

return $r;

}')

Nutzung:

$this->bbcode_second_pass_code('', '$unbuffered_query = db_unbuffered_query('SELECT * FROM accounts');')

Benchmark:

db_query 1000x SELECT * FROM accounts:

$this->bbcode_second_pass_code('', 'Totale Zeit 1000 Query: 0.459187984467s
Durchschnitt pro Query: 0.000459187984467s')

db_unbuffered_query 1000x SELECT * accounts:

$this->bbcode_second_pass_code('', 'Totale Zeit 1000 Query: 0.410293102264s
Durchschnitt pro Query: 0.000410293102264s')

Bringt zwar bei kleineren Abfragen auch einen Erfolg, sollte jedoch eher bei größeren Abfragen angewandt werden. Desweiteren widerspreche ich auch vielen Meinungen die sagen, mysql_unbuffered_query bringe bei ORDER BY Abfragen nichts. Da zeigt der Benchmark in einer großen Tabelle ebenfalls große Differenzen zwischen den Zeiten.

Autor:  dragonslayer [ Fr 10 Feb, 2012 14:35 ]
Betreff des Beitrags:  Re: Funktionssammlung

T'schuldigung, aber bei dem Post muss ich mich aus der Versenkung heraus mal melden: mysql_unbuffered_query macht bei LOTGD keinen Sinn.
Richtig, eine unbuffered query liest nicht das gesamte Ergebnis der Query in den Speicher, sondern immer nur die Zeile, die gerade im nachfolgenden foreach o.ä. benutzt wird. Nachteil dabei ist aber:
Du kannst kein num_rows darauf ausführen und was noch viel wichtiger ist, solange du das nicht abgeschlossen hast, ist die gesamte Tabelle gesperrt. Das bedeutet in diesem Falle (Select * from accounts) dass für die Zeit in der du über die Ergebnisse iterierst, niemand anders weder lesend noch schreibend auf die Tabelle zugreifen kann. Glaub mir, das willst du nicht. Ich hab es mal irgendwann bei Atrahor versucht. Danach konnte man nicht mehr spielen, weil jeder Seitenaufruf in einem Timeout landete.

Seite 2 von 2 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/