Avatar billede rthuls Nybegynder
12. januar 2004 - 22:49 Der er 16 kommentarer og
1 løsning

hjælp med arrays

Jeg prøver at lave et array ved navn "kunder" som indeholder to underarrays "firma" og "adresse". Jeg vil så gemme den data jeg henter fra db'en i "kunder" arrayet, således at firmanavnet bliver gemt i underarrayet "firma" osv.
Selv om jeg ikke helt forstår hvordan det skal gøres, har jeg forsøgt mig med nedenstående:

$kunder = array();
while ($row = mysql_fetch_array($result)){
  $kunder[] = ('firma' => $row['firma'],
  'adresse' => $row['adresse']
  };
}

for($i=0; $i<count($kunder); $i++){
  echo $kunder['firma'][$i];
  echo $kunder['adresse'][$i];
}
Avatar billede erikjacobsen Ekspert
12. januar 2004 - 22:54 #1
$kunder = array();
while ($row = mysql_fetch_array($result)){
  $kunder[] = $row;
}
for($i=0; $i<count($kunder); $i++){
  echo $kunder[$i]['firma'];
  echo $kunder[$i]['adresse'];
}
Avatar billede rthuls Nybegynder
12. januar 2004 - 23:35 #2
Lige hvad jeg skulle bruge! Ligger du lige et svar?
Avatar billede erikjacobsen Ekspert
12. januar 2004 - 23:53 #3
Det er bare rart det virker. Jeg samler ikke på point, tak.
Avatar billede rthuls Nybegynder
13. januar 2004 - 00:16 #4
Skal jeg så bare selv beholde dem? Under alle omstændigheder skal du have mange tak for hjælpen.
Avatar billede Slettet bruger
13. januar 2004 - 02:32 #5
Erik: Hvorfor vil du (og andre) så gerne sætte variablen til et tomt array inden tildeling med tomme klammer? Jeg er nysgerrig, for det er helt unødvendigt.
Avatar billede stingbat Nybegynder
13. januar 2004 - 03:23 #6
sandbox:
Unødvendigt? Hvis du vil lave ugyldig kode, så JA! ;)

Men sagen er den, at $kunder = array(); opretter variablen, og samtidig tildeler den til et tomt array.

Hvis du udelod denne linie, vil det altså betyde at du ved den første $kunder[], prøver at ændre en array som ikke eksistere - eller med andre ord, du prøver at ændre på "null".

At PHP så "godtager" at man skriver det, er desværre den side af sagen. For du vil hurtigt kunne se en "fejl", hvis du slår error og warnings til (ergo udviklingsmiljø).

Men du kan godt undlade at "declare" variablen, og lade PHP'en lege "gætteleg".

For at skære det lidt ud i pap, og sige det på en anden måde - du vil jo heller ikke kunne hælde lidt (ekstra) vand i en kop eller et glas, hvis du ikke har sådan ét allerede?! ;)
Avatar billede detox Nybegynder
13. januar 2004 - 04:13 #7
Jeg vil gerne medgive at det er god etik altid at definere sine variabler først, men det giver nu ingen notice eller warning, hvis man undlader det i dette tilfælde.
Avatar billede stingbat Nybegynder
13. januar 2004 - 04:41 #8
detox:
Åbenbart ikke lige ang. arrays - men i alle andre tilfælde plejer den. Men må vel være en "bug" at PHP'en ikke laver en warning.

Men ja - er god etik / programmeringsskik, at definere sine variabler - om det er nødvendigt eller ej.
Avatar billede Slettet bruger
13. januar 2004 - 05:18 #9
Det er kun hvis man prøver at udlæse en værdi fra en udefineret variabel, at man får en fejl.

I PHP definerer man jo netop en variabel (og dermed også et array) ved at putte noget i den, og når man siger $kunder[]=et-eller-andet bliver den også defineret som et array med den tildelte værdi på første ledige plads.

Kan du komme på eksempler, hvor PHP smider en warning, hvis man putter noget i en udefineret variabel? Jeg kan ikke (men jeg har heller ikke ligefrem ledt efter det).

Når jeg laver kode, har jeg altid error_reporting(E_ALL); i toppen indtil jeg ved skidtet virker.

Forresten er jeg lige kommet i tanker om en gyldig grund til at definere den som et tomt array først. Det er dog mest en bekvemmelighedsgrund. Så behøver man nemlig ikke checke for eksistensen af arrayet for det tilfælde, at der ikke skulle være nogen matchende kunder, før man laver en

foreach($kunder as $kunde){
  echo $kunde['firma'];
  echo $kunde['adresse'];
}

PHP springer nemlig glad og fro hen over den foreach, når $kunder bare er et tomt array. (Det samme sker med Eriks for-løkke.)
Avatar billede stingbat Nybegynder
13. januar 2004 - 05:31 #10
sandbox:
Eksempel kunne være så enkelte ting som (hvis de ikke er foruddefinerede):
$count++;
$str .= "123";

Mht. foreach, vil denne også være bedre i det tidl. eksempel. Men eftersom den anden virker, så undlod jeg at kommentere det.

Ang. $kunder[], uden foruddefinering, der kan det lade sig gøre uden fejl - men er dårlig skik! Som er hoppe over hvor gærdet er lavest ;-)
Avatar billede Slettet bruger
13. januar 2004 - 05:49 #11
stingbat:
Begge dine eksempler er jo nogle, der i princippet modificerer det allerede eksisterende indhold af variablen. Det vil sige, at de skal læse indholdet, og det giver PHP naturligvis en kommentar med på vejen, hvis error_reporting er sat til det.

Jeg sad lige og afprøvede forskellige kombinationer:

$row="";
$row[]='hej'; // Giver ikke så meget som en notice

$row='hej';
$row[]='hej'; // Giver Fatal error: [] operator not supported for strings

Jeg havde faktisk forventet at den første mindst ville give en Notice, da jeg jo havde tildelt variablen en (godt nok tom) streng.
Avatar billede stingbat Nybegynder
13. januar 2004 - 05:59 #12
sandbox:
Nu siger du jo selv "allerede eksisterende indhold af variablen" - for i princippet, ændre du jo også på indholdet vha. [].

Dette kan selvfølgelig diskuteres for og imod. Men fakta er, at man bør nu erklære sine variabler. Samtidig ved PHP også på forhånd HVAD type den enkelte variabel er, til det videre forløb.

Mht. til dine eksempler, så viser det jo ligeledes, at det er lidt buggy, den måde som PHP opfatter variabeltyperne på. For i teorien burde BEGGE fejle, eftersom du prøver at ændre en tekststreng (også selvom den er tom) ved at indsætte et array.

Så med andre ord - kan godt være at det i praktisk virker, men teoretisk og etisk set, er det forkert / giver fejl!
Avatar billede Slettet bruger
13. januar 2004 - 06:23 #13
OK, jeg vil indrømme, at det nok er mest korrekt at erklære som et (eventuelt tomt) array først. Jeg skal prøve at huske det, når jeg laver nye scripts.

Men ligefrem at kalde undladelsen "etisk forkert" er nok lidt overdrevet ;-)
Avatar billede erikjacobsen Ekspert
13. januar 2004 - 09:04 #14
Det er ikke bare "mest korrekt" at oprette arrayet først med

  $kunder=array();

det er det eneste korrekte. Hvis der ikke er tupler i resultatet fra SELECTen,
vil det efterfølgende ikke være et array, og diverse ting kan gå galt, fx når
man bruger funktioner, der forventer et array (array_pop - og andre).

Derudover garderer det mod dumme programmeringsfejl, hvis der fx allerede
står noget arrayet, fx fordi man allerede har brugt det til noget.
Avatar billede stingbat Nybegynder
13. januar 2004 - 13:46 #15
erikjacobsen:
Præcis - fik dog ikke lige præciseret den del ;-) Men ender hurtigt galt ja, hvis man ikke erklærer...

sandbox:
Ved ikke om det er så meget "overdrevet" - prøv at arbejde lidt med C/C++, og så finder du nok hurtigt ud af hvad der er rigtigt og forkert.
At du i C/C++ ikke kan undgå at erklære din variabler, er så en anden side af sagen *G*

Men altså - som sagt, man kan også hoppe over hvor gærdet er lavest - men hvis du ikke hopper højt nok, får du nok lidt ondt *av*
Eller script-mæssigt, hvis du som "erikjacobsen" rigtigt nok fortalte, ikke har nogen rækker i tabellen, findes variablen ikke, og en fejl opstår.
Avatar billede stingbat Nybegynder
16. januar 2004 - 22:39 #16
rthuls:
Husk lige at lukke spørgsmålet :-)
Avatar billede rthuls Nybegynder
18. januar 2004 - 22:00 #17
Har ikke været online de sidste par dage. Skal nok lukke nu :o)
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