mmofacts.com

Kontrollstrukturen mit strings verbinden?

gepostet vor 16 Jahre, 6 Monate von DarkPrisma
Hallo,
gibt es eine möglichkeit Kontrollstrukturen, wie foreach in einem String zu verbinden?

echo "Test Schleife ".(foreach($array AS $key => $value){}.)" nach der Schleife";
?>
das geht leider nicht. normale funktionen mit strings zuverbinden ist ja kein problem.... das bringt mir nur nix, ich benötige genau diese form!
gepostet vor 16 Jahre, 6 Monate von TheUndeadable
Und was soll rauskommen?
Mir ist es etwas unklar, was du eigentlich benötigst.
Brauchst du ein 'intelligentes' join? Dies wirst du am elegantesten mit funktionalen Ansätzen erreichen.
gepostet vor 16 Jahre, 6 Monate von DarkPrisma
nein, ich benötige die möglichkeit kontrollstrukturen inerhalb eines strings auszuführen und das ergebnis dann an der stelle im string anzuhängen. (templatesystem mit foreach etc...)
gepostet vor 16 Jahre, 6 Monate von Amun Ra
Ich sag mal spontan das geht mit PHP nicht.
Warum auch?
das lässt sich doch auch anders lösen.
function mach_was($array) {

foreach () {
}
}
echo 'davor'.mach_was($array).'danach'
gepostet vor 16 Jahre, 6 Monate von DarkPrisma
es hat schon einen grund warum ich das brauche... für die if gibts ja eine kurzform: () ? () : () genau sowas brauch ich für die foreach/for
gepostet vor 16 Jahre, 6 Monate von Amun Ra
Das musst du dann wohl selbst implementieren...
gepostet vor 16 Jahre, 6 Monate von DarkPrisma
ja leider, aber wenn jemand noch was findet, schreibts mir bitte
gepostet vor 16 Jahre, 6 Monate von Amun Ra
Ein Anwendungsbeispiel wär ganz nett...
Das kann ja kein großes Geheimnis sein.
gepostet vor 16 Jahre, 6 Monate von DarkPrisma
ja brauche das halt für mein template system, if hab ich mit der kurzschreibweise hinbekommen. damit das nämlich alles geparsed wird, benötige ich eine mischung aus html und php. die stellen wo der phpcode ist werden ausgeführt und der htmlcode dann ausgegeben.
gepostet vor 16 Jahre, 6 Monate von TheUndeadable
Du könntest es mit funktionalen Ansätzen probieren. Ich weiß nur nicht ob PHP dazu in der Lage ist.
Pseudo-C#:
String Join ( Enumerable array, Action action )
{
String strReturn;
foreach ( item in array )
{
strReturn += action(item);
}
return strReturn;
}
in deinem Query könntest du dann: return "TEXT: " + Join ( Array, x => "Item: " + x ) + "FERTIG"; nutzen.
Mit genügend Kunststückchen lässt sich sowas auch in PHP bauen
gepostet vor 16 Jahre, 6 Monate von DarkPrisma
hrm... ok sowas hab ich mri auch gedacht, schonmal eine vorabversion
$array = Array(

0 => Array('11', '12', '13'),
1 => Array('21', '22', '23'),
2 => Array('31', '32', '33')
);
//echo "Test Schleife ".(foreach($array AS $key => $value){}.)" nach der Schleife";
function tpl_fe($array = array(), $content = "", $position = 0, $key = 'key', $value = 'value'){
if(is_array($array)){
foreach($array AS ${$key} => ${$value}){
//if(!is_array(${$value})) echo ${$key}." AS ".${$value}."\n";
if($position == 0){
$ausgabe_fe .= $content.tpl_fe(${$value})."\n";
}else{
$ausgabe_fe .= tpl_fe(${$value}).$content."\n";
}
}
}else{
return $array;
}

return $ausgabe_fe;
}
$content = "bin drin ! ";
echo "Test Schleife \n".tpl_fe($array, $content, 0, 'key', 'value')."nach der Schleife";
das problem ist, das er mir nur das hier ausgibt:
Test Schleife 

bin drin !
bin drin !
22
23
bin drin !
32
33
nach der Schleife
wie man sieht verschluckt der das ganze erste array und dann immer das erste value....
gepostet vor 16 Jahre, 6 Monate von wusch

function splat(&$array){
return $array = !is_array($array) ? (is_null($array) ? array() : array($array)) : $array;
}
function parse($array, $fn){
foreach(splat($array) as $k => &$v)
$v = call_user_func_array($fn, array($k, $v));

return implode($array);
}

Usage:

parse(array('blah' => 'helloo'), 'myFn'));
function myFn($key, $value){
//doSomething;
}
Ist aber vielleicht nicht ganz so performant, wenn man das mit vielen bzw. großen Arrays macht, könnte aber trotzdem ganz nett sein =) Wegen call_user_fun_array kann man auch Funktionen von Instanzen einer Klasse oder einer statischer Klasse verwenden.
gepostet vor 16 Jahre, 6 Monate von DarkPrisma
hi, cool schonmal, aber erklärt mir doch bitte mal, wo ich den fehler mache:
$key 	= 'key';

$value = 'value';
foreach($array AS ${$key} => ${$value}){
echo ${$key}." -> ".${$value}."\n";
}
der fängt immer bei der 2. zeile an O.o
gepostet vor 16 Jahre, 6 Monate von TheUndeadable
Eigentlich heißt es:
foreach ( $aszArray as $key => $value )
evtl liegt es an deinen doppelten $-Zeichen...
gepostet vor 16 Jahre, 6 Monate von Otteros
was übergibst du eigtl. den namen der Variablen zum Zwischenspeichern?
Die Variablen werden doch nur in der Funktion genutzt, also ist es doch egal wie die heißen.
(Alles auf das letzte Testbeispiel bezogen)
gepostet vor 16 Jahre, 6 Monate von Fobby
$key 	= 'key';
$value = 'value';
foreach($array AS ${$key} => ${$value}){
echo $key." -> ".$value."\n";
}

So würde ich sagen. Denn im Schleifenkopf erstellst du dynamisch Variablen, die du dann aber auch so benutzen kannst/musst.
gepostet vor 16 Jahre, 6 Monate von Klaus
mach doch einfach eine simple Template Engine "mit PHP".

$value): ?>

oder mit aktivierten shortopentags


in der Datei die die Logik enthält musst du dieses Template dann nur noch includen.
Vorteile: 0% Implementierung, 100% Flexibilität
PS: Diese erweiterte Syntax funktioniert auch mit if, else, while etc.
gepostet vor 16 Jahre, 6 Monate von Otteros
Original von Fobby
$key 	= 'key';

$value = 'value';
foreach($array AS ${$key} => ${$value}){
echo $key." -> ".$value."\n";
}
So würde ich sagen. Denn im Schleifenkopf erstellst du dynamisch Variablen, die du dann aber auch so benutzen kannst/musst.

Das würde nicht gehen, weil er ja dann auf die Werte der Variable $key und $value zugreift, was nicht Sinn und Zweck der Sache ist. Das was er schon hatte wäre da schon richtig.
gepostet vor 16 Jahre, 6 Monate von progs
Original von Otteros
Original von Fobby
$key 	= 'key';

$value = 'value';
foreach($array AS ${$key} => ${$value}){
echo $key." -> ".$value."\n";
}
So würde ich sagen. Denn im Schleifenkopf erstellst du dynamisch Variablen, die du dann aber auch so benutzen kannst/musst.

Das würde nicht gehen, weil er ja dann auf die Werte der Variable $key und $value zugreift, was nicht Sinn und Zweck der Sache ist. Das was er schon hatte wäre da schon richtig.
Jedoch auch nur Teilweise richtig. Den, wenn die Variablen $key den Wert "key" und $value den Wert "value" hat, dann greigt er so oder so auf diese Variablen zu.
gepostet vor 16 Jahre, 6 Monate von Otteros
Ok, hast recht, ich gebe mich geschlagen, ist mir auch gerade aufgefallen, der überschreibt somit eigtl. immer seine eigenen variablen, da sollte man aufpassen, wie man die variablen nennt.
gepostet vor 16 Jahre, 6 Monate von DarkPrisma
ok leute, nächstes problem:
$array = Array(

0 => Array('11', '12', '13'),
1 => Array('21', '22', '23'),
2 => Array('31', '32', '33')
);
//echo "Test Schleife ".(foreach($array AS $key => $value){}.)" nach der Schleife";
function tpl_fe($array = array(), $k = 'key', $v = 'value', $content = ""){
if(is_array($array)){
foreach($array AS ${$k} => ${$v}){
$ausgabe .= $content;
}
}else{
return $array;
}
return $ausgabe;
}
$content = "bin drin $value!\n";
echo "Test Schleife \n".tpl_fe($array, 'key', 'value', $content)."nach der Schleife\n\n";
irgendwer eine idee, wie ich bei dem string: $content = "bin drin $value!\n"; das value nur ersetzte wenn der in der in der foreach ist. also auch mit der variable value aus dem foreach....
ps: danke nochmal für eure hilfe
gepostet vor 16 Jahre, 6 Monate von Kallisti
Kommentier das bitte mal und erklaer uns den Gesamtkontext... Wo bitte ist da der Sinn?
Wieso empfaengt die Funktion $k und $v als Parameter, wenn du sie eh ueberhaupt nicht nutzt? Wozu die default Werte, die verzerren dir doch nur Error handling? Was soll der Muell mit ${$k} und ${$v}??
Mir fehlt wirklich vorn und hinten das Verstaendnis fuer so einen Code?!
Benutz doch einfach eine gute existierende Template Engine, so machst du dir nur selbst das Leben schwer.... und performant wird das mit Sicherheit auch nicht.
Ich hab das Gefuehl, dass du selbst nicht weisst, was du da tust... und Halbwissen ist etwas, das man beim Schreiben von Libraries echt nicht gebrauchen kann.
Ansonsten ist das Zauberwort "eval"...
gepostet vor 16 Jahre, 6 Monate von DarkPrisma
Original von Kallisti
Ich hab das Gefuehl, dass du selbst nicht weisst, was du da tust... und Halbwissen ist etwas, das man beim Schreiben von Libraries echt nicht gebrauchen kann.
Ansonsten ist das Zauberwort "eval"...

was halbwissen angeht, hast du jetzt grade wohl den vogel abgeschossen.. www.php.net/language.variables.variable solltest du dir durchlesen...
btw, habs geschaft, musste nur die variablen escapen. jetzt brauch ich nur noch eine lösung für die rekursive auflösung des codes.... aber da guck ich erstmal selber, vllt schreib ich dann nacher nochmal, falls ich nochmal eure hilfe brauche aber eigentlich ist ja selber der mann
gepostet vor 16 Jahre, 6 Monate von Kallisti
Ich maße mir zuallererst aber nicht an php zu koennen, programmier nicht in php und schon gar nicht meine eigene Templating-Engine. ^^
Desweiteren aendert der Link nichts an meiner Aussage, abgesehen davon, dass ich den Code jetzt noch viel dreckiger und gefaehrlicher finde als vorher.
(In Perl nutzt man ${}/@{}/%{} zum dereferenzieren von Referenzen...)
gepostet vor 16 Jahre, 6 Monate von DarkPrisma
man merkt das du es nicht programmieren kannst, nur ne große klappe kannste haben... ich hasse solche leute, keine ahnung aber labern is, doof, is unsicher, ist falsch etc....
gepostet vor 16 Jahre, 6 Monate von Kallisti
Naja du durchlaeufst eine Schleife und benennst deine Laufvariablen dynamisch, ohne sicherzustellen ob und wofuer sie innerhalb der Schleife genutzt werden... Das ist keine Trennung von Daten und Logik und viel Spass bei der Fehlersuche, wenn sich in den Templates ein Name verirrt hat, der zufaelligerweise bereits als Variable im Code auftaucht... 'ausgabe' ist z.B. sicher lustig. ^^
Und jetzt erzaehl mir nicht, dass du das Konstrukt brauchst, wenn du immer die 'key'/'value' defaults benutzt...
Ich verstehe das Ganze als den Versuch das Templating insofern zu vereinfachen, dass man ein Array und einen String an eine Funktion uebergibt und die Engine daraus einen Block bastelt in dem sich der String fuer jedes Element des Arrays wiederholt.
Die Frage ist meiner Meinung nach aber eher, ob so etwas Sinn macht. Weil: Du brauchst so oder so Schleifenkonstrukte in einer nutzbaren Template Engine. Allein schon weil du nicht sicherstellen kannst, dass deine Datenstrukturen immer nur aus simplen Arrays bestehen. Desweiteren weil du vielleicht noch mehr in jeder Iteration aufbereiten musst. D.h. da kommt man nicht drum herum. In meinen Augen ist es nun sinnvoller die Template Engine moeglichst schlank zu halten und nicht unnoetig aufzublasen, zum einen aus Performance Gruenden, zum anderen um sich an einen Standardweg zu gewoehnen, der universell ist und eben immer genutzt werden kann.
Ob foreach(@array) { print 'string'.$_); oder template_foreach(@array, 'var', 'string')... Macht es einen Unterschied? Wenn ja, erklaer ihn mir bitte. Ansonsten gilt natuerlich TIMTOWTDI, aber sauber sieht es fuer mich nun einmal nicht aus.
gepostet vor 16 Jahre, 6 Monate von DarkPrisma
ist dir schonmal in den sinn gekommen, dass ich diese funktion so garnicht benutze? ich hab lediglich eine ähnliche nachgebaut damit ich nicht den ganzen komplexen code hier reinhauen muss.
gepostet vor 16 Jahre, 6 Monate von Kallisti
Original von DarkPrisma
ist dir schonmal in den sinn gekommen, dass ich diese funktion so garnicht benutze? ich hab lediglich eine ähnliche nachgebaut damit ich nicht den ganzen komplexen code hier reinhauen muss.

Naja, wenn ich bei etwas helfen moechte, moechte ich den Kern des Problems verstehen, weil es vielleicht eine Loesung gibt, die viel einfacher und praktischer ist... Daher erwarte ich eigentlich schon, dass man das gesamte Problem an einem echten Beispiel aufzeigt und nicht an Symptomen herumdoktert, die in der Gesamtheit u.U. gar keinen Sinn ergeben. ^^
PS: Sorry fuer den rauhen Ton, bin irgendwie etwas aggressiv heute... viel zu warm.
gepostet vor 16 Jahre, 6 Monate von phi
foreach ist eine schleife eine kontrollstruktur wäre zB switch case oder if
gepostet vor 16 Jahre, 6 Monate von DarkPrisma
Original von phi
foreach ist eine schleife eine kontrollstruktur wäre zB switch case oder if

du guckst hier;: de.php.net/manual/de/langref.php unter Kontrollstrukturen

Auf diese Diskussion antworten