Avatar billede limes_planum Praktikant
23. september 2007 - 13:00 Der er 13 kommentarer og
1 løsning

C-pointer-agtigt problem med variabel

Jeg smelter to strenge sammen:

for ($i=1;$i<11;$i++){
//sj1
$sjs='$sj';
$is=strval($i);
$arrayt = array($sjs,$is);
$samstr=implode($arrayt);
echo"&samstr=$samstr<br>";
switch ($samstr)
{
case "?":
echo"?er<br>";
... etc.

- så langt så godt. Problemet er nu at switchen ikke læser $samstr som en slags C++-pointer - jeg kan ikke gå ind og lave en eval på $samstr eller '$sjs med $is', hvilket jeg ellers kan gøre i Actionscript således:

switch (eval(sjs+i))

-(har lige prøvet det i flash og det virker...)
[alternativt skulle det jo være: switch (eval($sjs+$is)) - i php selvf.]

Kunne være lækkert om der fandtes en slags tekst/streng-eval i php også - hvad skal jeg gøre for at '$samstr' henviser til en anden strengværdi i stedet for bare at blive 'switchet' som en normal værdi?
Avatar billede limes_planum Praktikant
23. september 2007 - 13:33 #1
Det skal påpeges at sp'et er en konsekvens af http://www.eksperten.dk/spm/797759
Avatar billede olebole Juniormester
23. september 2007 - 16:31 #2
<ole>

Prøv at forklare, hvad det er, du gerne vil lave

/mvh
</bole>
Avatar billede olebole Juniormester
23. september 2007 - 16:33 #3
- og så virker eval iøvrigt væsentligt forskelligt i PHP henholdsvis i JavaScript/ActionScript
Avatar billede johan.o Nybegynder
23. september 2007 - 17:36 #4
Måske dette kan hjælpe dig :

<?php

$sj1="a"; $sj2="b"; $sj3="c"; $sj4="d"; $sj5="e"; $sj6="f"; $sj7="g"; $sj8="h"; $sj9="i"; $sj10="j";
$start="\$sj";

for($i=1; $i<11; $i++) {
$var=$start.$i;
eval("\$var=\"$var\";");
echo $var; }

?>

Mvh. Johan
Avatar billede limes_planum Praktikant
25. september 2007 - 16:49 #5
I http://www.eksperten.dk/spm/797759 kan man se at jeg gerne vil forkorte min kode mest muligt - hvis jeg en anden gang skulle i samme situation kan det være lækkert at bruge en sådan swicth, der kan håndtere et evalueret iterator-argument. :-)

Havde håbet på at få lidt flere PHP-topguns ud af skabet da det er en 200-pointer, så gætter på at de ikke har svaret grundet det ikke kan lade sig gøre. Som kommenteret i http://www.eksperten.dk/spm/797759 ville jeg ikke bruge alt for meget energi på finde en perfekt løsning v/ dette sp (ser jo heller ikke ud til den findes) og lukker derfor sp'et..

Tak for indsatsen Johan, og jeg kan se at det vil forkorte koden en del - men jeg var altså ude efter en principiel switch-syntax, der henviser til en anden var og som jeg kan bruge en anden gang med max forkortelse. :-)
Avatar billede johan.o Nybegynder
25. september 2007 - 17:58 #6
Det er fint med mig, jeg forstår bare ikke helt hvad du mener :)

Switch syntaksen er jo blot switch($var) istedet for echo $var; i det jeg skrev til dig....men jeg har måske misforstået opgaven ?!!?

Mvh. Johan
Avatar billede limes_planum Praktikant
26. september 2007 - 10:49 #7
Det her er hvad jeg er endt med, da jeg ikke kunne forkorte med en for-løkke med en switch i (kunne også ha brugt din opstilling):

<?php
$samt=0;
//sj1
switch ($sj1)
{
case "?":
$samt=$samt+1;
break;
case "%":
$samt=$samt+1;
case "":
break;
default:
if(intval($sj1)>=0 && intval($sj1)<=100){
$samt=$samt+1;
}
break;
}

//sj2
switch ($sj2)
{
case "?":
$samt=$samt+1;
break;
case "%":
$samt=$samt+1;
case "":
break;
default:
if(intval($sj2)>=0 && intval($sj2)<=100){
$samt=$samt+1;
}
break;
}

//sj3
switch ($sj3)
{
case "?":
$samt=$samt+1;
break;
case "%":
$samt=$samt+1;
case "":
break;
default:
if(intval($sj3)>=0 && intval($sj3)<=100){
$samt=$samt+1;
}
break;
}

//sj4
switch ($sj4)
{
case "?":
$samt=$samt+1;
break;
case "%":
$samt=$samt+1;
case "":
break;
default:
if(intval($sj4)>=0 && intval($sj4)<=100){
$samt=$samt+1;
}
break;
}

//sj5
switch ($sj5)
{
case "?":
$samt=$samt+1;
break;
case "%":
$samt=$samt+1;
case "":
break;
default:
if(intval($sj5)>=0 && intval($sj5)<=100){
$samt=$samt+1;
}
break;
}

//sj6
switch ($sj6)
{
case "?":
$samt=$samt+1;
break;
case "%":
$samt=$samt+1;
case "":
break;
default:
if(intval($sj6)>=0 && intval($sj6)<=100){
$samt=$samt+1;
}
break;
}

//sj7
switch ($sj7)
{
case "?":
$samt=$samt+1;
break;
case "%":
$samt=$samt+1;
case "":
break;
default:
if(intval($sj7)>=0 && intval($sj7)<=100){
$samt=$samt+1;
}
break;
}

//sj8
switch ($sj8)
{
case "?":
$samt=$samt+1;
break;
case "%":
$samt=$samt+1;
case "":
break;
default:
if(intval($sj8)>=0 && intval($sj8)<=100){
$samt=$samt+1;
}
break;
}

//sj9
switch ($sj9)
{
case "?":
$samt=$samt+1;
break;
case "%":
$samt=$samt+1;
case "":
break;
default:
if(intval($sj9)>=0 && intval($sj9)<=100){
$samt=$samt+1;
}
break;
}

//sj10
switch ($sj10)
{
case "?":
$samt=$samt+1;
break;
case "%":
$samt=$samt+1;
case "":
break;
default:
if(intval($sj10)>=0 && intval($sj10)<=100){
$samt=$samt+1;
}
break;
}
if($samt == 10 || $opr ==1)
{
$opr =1;
$link=mysql_connect("localhost", ...... etc.

- altså 10 if-sætninger der fylder.
Avatar billede limes_planum Praktikant
26. september 2007 - 10:50 #8
undsk: "- altså 10 switcher der fylder."
Avatar billede johan.o Nybegynder
26. september 2007 - 15:48 #9
Virker det her ?...

<?php
$samt=0;
$start="\$sj";

for($i=0; $i<11; $i++) {
$var=$start.$i;
eval("\$var=\"$var\";");

switch ($var) {
  case "?":
  $samt=$samt+1;
  break;
  case "%":
  $samt=$samt+1;
  case "":
  break;
  default:
  if(intval($var)>=0 && intval($var)<=100) {
    $samt=$samt+1; }
  break;
  }
}

?>

Mvh. Johan
Avatar billede johan.o Nybegynder
26. september 2007 - 15:50 #10
...men bortset fra det kan du så ikke lave din kode således at istedet for $sj0, $sj1...osv...så bruger du et array, f.eks. $sj hvor indholdet fyldes i ? Det kunne gøre behandlingen lidt 'nemmere'.

Mvh. Johan
Avatar billede limes_planum Praktikant
28. september 2007 - 18:38 #11
hey johan - det ser spændende ud, men da jeg indtil videre har fundet en midlertidig løsning vil jeg først kigge på din løsning på et givent tidsp. indenfor de næste 4 uger, da det projekt jeg er ved at rode med har andre dele der skal udfærdiges lige nu :-)
Avatar billede johan.o Nybegynder
29. september 2007 - 12:13 #12
Du kigger bare når du får tid :)

Jeg tror faktisk ikke det behøver være så 'besværligt' alligevel. Eval() behøves slet ikke, istedet kan du benytte dobbelt dollar deklarering af variablen....

Læs evt. mere her...

http://no2.php.net/manual/da/language.variables.variable.php

..det kunne evt. se sådan her ud...

<?php
$samt=0;
$start="sj";

for($i=0; $i<11; $i++) {
$tmp=$start.$i;
$var=$$tmp;

switch ($var) {
  case "?":
  $samt=$samt+1;
  break;
  case "%":
  $samt=$samt+1;
  case "":
  break;
  default:
  if(intval($var)>=0 && intval($var)<=100) {
    $samt=$samt+1; }
  break;
  }
}

?>

Mvh. Johan
Avatar billede limes_planum Praktikant
21. oktober 2007 - 11:53 #13
Hey Johan O - Det virker max med $$tmp;
:-) - så selvom sp'et er lukket skal du have mange tak for indsatsen.
Avatar billede johan.o Nybegynder
21. oktober 2007 - 12:09 #14
Velbekomme :)

Mvh. Johan
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester