Avatar billede mik789 Nybegynder
13. november 2003 - 12:38 Der er 24 kommentarer og
1 løsning

anførselstegn i associative arrays

Jeg har lært at man angiver felter i et associativt array med anførselstegn omkring, altså f.eks.:

$mitArray["navn"], $mitArray["adresse"] osv.

Men nu laver jeg noget på et site der ikke vil have anførselstegn om felterne, men kun f.eks.:

$mitArray[navn] osv.

Hvad skyldes det? Er det noget serverens php opsætning? Hvad er reglerne? (Eller er der noget jeg helt har misforsået?)

//mik
Avatar billede detox Nybegynder
13. november 2003 - 12:57 #1
Hvordan ser linien ud, hvor du bruger: $mitArray[navn]?
Avatar billede mik789 Nybegynder
13. november 2003 - 13:05 #2
detox> det med navn var bare et eksempel. Her er en linje fra den virkelige verden:

if($arrayInfoArts[abstract]!="") echo " &ndash; <a href=\"java script:openAbstract($arrayInfoArts[trim_art_id]);\" title=\"Abstract\">[a]</a>";

du kan se at det gælder ikke alene i echo strengen men også i den første betingelsessætning. Hvis jeg her bruger anførselstegn omkring feltnavnene (begge steder, men selvfølgelig enkelt-anførselstegn i echo sætningen), fungerer det ikke.
Avatar billede jakoba Nybegynder
13. november 2003 - 13:12 #3
anførselstegn om den sekvens a tegn der skal identificeres som 'en streng' er det korrekte.

men i gammel php ville man 'hjælpe brugerne' med den meget almindelige fejl at de glemte dem, så siden man kunn lave en logisk sekvens  "navn står ikke i navntabellen så det er ikke en konstant" -> "så er det nok en streng" og sætte anførselstegnene selv, besluttede de at tillade at anførselstegne blev udeladt der.  (ligesom IE der tillader næsten hvadsomhelst og så prøver at gætte hvad brugeren mener i hver situation)

Den filosofi er komme noget i miskredit efterhånde (jo det hjælper da nybegynderen lidt, men gør det samtidig nærmest umuligt for ham at lære af sine erfaringer) så nu vil php gerne væk fra det.

så hvor du før kunne skrive
  echo "streng med et $array[opslag] indeni";
bør du nu bruge den korrekte syntaks for indlejrede komplexe variabler, dvs sætte en tuborg-parentes omkring variablen for at indikere at her er en indlejret variabel ser skal udrenes og derefter indsættes i strengen:
  echo "streng med et {$array["opslag"]} indeni";
siden variablen bliver udregnet først kan du bruge hvad tegn du vil indi {} uden at komme i konflikt med reglerne for anførselstegn i strenge.

http://dk.php.net/manual/en/language.types.string.php#language.types.string.parsing.complex

mvh JakobA
Avatar billede jakoba Nybegynder
13. november 2003 - 13:17 #4
He He, i dit eksempel laver du vist samme fejl i javascript, der kommer til at stå:
<a href="java script:openAbstract(art_id_bogstaver);" title="Abstract">[a]</a>

og der burde altså være anførselstegn om din streng 'art_id_bogstaver', men akkeja, IE tillader det.
Avatar billede mik789 Nybegynder
13. november 2003 - 13:20 #5
jakoba> det du skriver lyder som om at servere med "gammel php" burde torerere BÅDE feltnavne med og uden anførselstegn, så det burde ikke give problemer med:

$array["opslag"]

men det gør det faktisk på denne server. den vil kun have $array[opslag]
Avatar billede mik789 Nybegynder
13. november 2003 - 13:31 #6
jakoba> ups, du har ret! der kommer f.eks. til at stå (snuppet fra kilden):

<a href="java script:openAbstract(1.3);" title="Abstract">[a]</a>

og der mangler rigtigt nok ' omkring 1.3.

Men det er ikke alene IE der spiser det. Jeg har testet i både Netscape 6/7 og Mozilla. Ingen brokker sig, heller ikke Netscapes Javascript konsol.
Avatar billede jakoba Nybegynder
13. november 2003 - 13:32 #7
indeni en streng kan $array["opslag"] ikke bruges uden noget til at fortælle at de "-tegn relaterer til variablen og ikke til strengen (der forventer at skulle ende ved første "-tegn den ser)
      echo "streng med et $array["opslag"] indeni";  //bliver læst som:
      echo "streng med et $array["        // med en syntaksfejl bagefter.
så det kan selv gamle servere ikke hitte ud af.

Og nye php-versioner tillader da stadig den gamle  $array[opslag]  men det giver en varning, og (mere betydningsfuldt) om et par versioner holder de op med at tillade det overhovedet.

mvh JakobA
Avatar billede jakoba Nybegynder
13. november 2003 - 13:36 #8
1.3 ligner et tal, så hvis du bruger det som et tal indenini funktionen skal der IKKE anførselstegn omkring. (jeg gik ud fra at det var værdien fra en id='noget' attrubut)
Avatar billede mik789 Nybegynder
13. november 2003 - 13:43 #9
jakoba>
1) det er klart at indeni en streng med " omrking går det ikke at sætte " omkring feltnavne i et array.
2) ja javascript opfatter det nok som tal. Det er faktisk en streng fra databasen hvor det har typen VARCHAR. Men det er jo ligegyldt for javascript, og det er nok derfor der ikke bliver problemer.

Det med tuborg lyder OK. Dog må det nemt kunne give fejl at et $ (variabeltegn) SKAL følge umiddelbart efter { - Man er nemt i vane med at se stort på blanktegn.
Avatar billede jakoba Nybegynder
13. november 2003 - 13:57 #10
Ja, det kan bruges forkert. så der kommer fejl. Hvad kan ikke det :-))
Avatar billede jakoba Nybegynder
13. november 2003 - 14:01 #11
Det der med anførselsteng og strenge er også lidt forvirret i javascript, jeg lavede en side om det engang: http://hjem.get2net.dk/Jakob.Aggernaes/prek/artikel1.html
Avatar billede mik789 Nybegynder
13. november 2003 - 14:06 #12
jakoba> det bliver mere forvirrende. Jeg har forsøgt med følgende:

      if ($arrayInfoArts[type]=="Invited paper" || $arrayInfoArts[type]=="Papers"){
        echo "{$arrayInfoArts["forfatter"]}, &ldquo;{$arrayInfoArts["titel"]}&rdquo;</a>";

- dette giver ingen fejl, men hvis jeg er konsekvent og gør det samme i betingelsen, sådan:

      if ({$arrayInfoArts["type"]}=="Invited paper" || {$arrayInfoArts["type"]}=="Papers"){
        echo "{$arrayInfoArts["forfatter"]}, &ldquo;{$arrayInfoArts["titel"]}&rdquo;</a>";

- får jeg fejl. Det dur simpelthen ikke hvis ikke man kan bruge {} konsekvent.
Avatar billede mik789 Nybegynder
13. november 2003 - 14:07 #13
- og det har ikke noget at gøre med at if-sætningens afslutnings-} mangler ovenfor - det er bare fordi det er klippet ud
Avatar billede jakoba Nybegynder
13. november 2003 - 14:53 #14
i din betingelse står array-opslaget jo ikke som en del af en streng. så der er {} helt ubegrundet (og bliver formodentlig forvekslet med {} i betydningen sætningsblok-begynd og sætningsblok-slut)

mvh JakobA
Avatar billede jakoba Nybegynder
13. november 2003 - 14:57 #15
du bruger anførselstegn helt normalt når variabelen ikke er indlejret i en streng.
      if ( $arrayInfoArts['type']=="Invited paper" || $arrayInfoArts["type"]=="Papers" ){
        echo "{$arrayInfoArts["forfatter"]}, &ldquo;{$arrayInfoArts["titel"]}&rdquo;</a>";
Avatar billede mik789 Nybegynder
13. november 2003 - 14:58 #16
ok, så kompleks syntaks er kun relevant inden i strenge - jeg er med.
men her hvor serveren ikke vil have anførselstegn omkring feltnavne der ikke er del af en streng, bliver det bare mere indviklet at skrive det anderledes inden i strengene. Jeg tror det er specielt for denne server som måske har en meget "gammel php". Men for andre opgaver er det godt at vide hvad der er "rigitgt".
Avatar billede mik789 Nybegynder
13. november 2003 - 15:00 #17
jakoba 13/11-2003 14:57:21> ja, men det er det jeg IKKE kan på denne server. Den vil kun have det uden, altså:

if ( $arrayInfoArts[type]=="Invited paper" || $arrayInfoArts[type]=="Papers" )

- har prøvet alle kombinationer ;-)
Avatar billede mik789 Nybegynder
13. november 2003 - 15:02 #18
- og er der nogen speciel grund til at du vil have mellemrum efter "(" og før ")"??
Avatar billede jakoba Nybegynder
13. november 2003 - 15:04 #19
Det helt basale alternativ er slet ikke at benytte sig af php's "du kan indlejre variabelværdier i en streng" og istedet sætte strengen sammen af stumper med . operator imellem.

    if ( $arrayInfoArts['type']=="Invited paper" || $arrayInfoArts["type"]=="Papers" ){
        echo $arrayInfoArts["forfatter"] . ", &ldquo;" . $arrayInfoArts["titel"] . "&rdquo;</a>";

det er 100% konsekvent og forståeligt, men du skal skrive et par bogstaver ekstra.
Avatar billede jakoba Nybegynder
13. november 2003 - 15:10 #20
mine blanktegn efter ( og før ) er blot for overskuelighed, så det er nemmere at tælle start og slut for at sikre der er lige mange.

Det var en sær server. Jeg kan ikke give nogen forklaring på hvorfor nogen skulle ønske at sætte den så tåbeligt op (eller hvordan de gjorde det). Hvad siger php_info() ?
Avatar billede mik789 Nybegynder
13. november 2003 - 15:10 #21
det med at indlejre variabelværdier i tekststrenge er nu en meget smart ting ved php. Og det er jo konsekvent nok hvis man bare veksler mellem " og ' i strenge. F.eks.:

if ($arrayInfoArts['type']=="Invited paper" || $arrayInfoArts['type']=="Papers"){
        echo "$arrayInfoArts['forfatter'], &ldquo;$arrayInfoArts['titel']&rdquo;</a>";
Avatar billede mik789 Nybegynder
13. november 2003 - 15:11 #22
jeg ved ikke med php-info - vi flytter snart det hele til en mere "normal" server, så pyt med det. Jeg ville bare vide hvordan det er generelt.

Du har været en god hjælp, så læg lige et svar ;-)

//mik
Avatar billede jakoba Nybegynder
13. november 2003 - 15:21 #23
se afsnittet  "do's and dont's"  på denne side: http://dk2.php.net/manual/en/language.types.array.php
det du beskriver burde ikke være muligt :(

kan det være at den kode du skriver på en eller anden måde bliver set af php som en streng. Det kunne det fx bliver hvis du benytter et macrosystem af en art, eller gemmer php koden i en database.

mvh JakobA
Avatar billede jakoba Nybegynder
13. november 2003 - 15:23 #24
nå ok.
Avatar billede mik789 Nybegynder
13. november 2003 - 15:29 #25
jakoba 13/11-2003 15:21:00> næ, jeg gør hverken det ene eller det andet, og der er heller ikke tale om foruddefinerede konstanter eller variabler (sådan som dit link nævner). Det MÅ simpelthen være noget med denne specielle server, for jeg har heller ikke været ude for det før på andre servere hvor jeg har benyttet samme kode.
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