[PHP] Keys ene array binden aan values andere array

Pagina: 1
Acties:

Onderwerpen


  • MarcoC
  • Registratie: September 2003
  • Laatst online: 22:00
Ik heb een array automerken, met als key/index het id waarmee ze in de database staan opgeslagen:
code:
1
Array ( [1] => Audi [2] => BMW [3] => Mercedes )


Daarnaast heb ik een variable met daarin de id's van de automerken, gescheiden door komma's. Bijv: 1,3. Deze explodeer ik tot een array:
PHP:
1
2
3
<?
explode(",",$auto_ids);
?>
Dit geeft zoiets als:
code:
1
Array ( [0] => 1 [2] => 3 )


Nu zoek ik hoe ik de volgende array van deze twee array's kan maken:
code:
1
Array ( [1] => Audi [3] => Mercedes )


Dit lijkt me vrij simpel, maar ik kan echt niet vinden hoe ik dit met PHP moet doen. Iemand een idee? Ik heb zo'n beetje alle arrayfuncties op php.net doorgekeken, maar daar zie ik nergens hoe je keys van de ene array kan binden aan values van de andere array. Mijn dank zal zeer groot zijn, ook als het antwoord heel simpel blijkt te zijn _/-\o_ .

  • MarcoC
  • Registratie: September 2003
  • Laatst online: 22:00
Zul je natuurlijk altijd zien dat je na een half uur ploeteren na het openen van het topic binnen 10 minuten het antwoord hebt als je er nog eens ééñmaal rustig over nadenkt. Natuurlijk moet het gewoon zo:
PHP:
1
2
3
foreach(explode(",",$explodedautomerken as $key=>$value) {
        $automerk[$key] = $automerken[$value];
    }

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

PHP:
1
$nieuwArray = array_intersect_key($arrayMetMerken, array_flip($arrayMetIDs));

Dat zou ook moeten werken. ;)

edit:
Overigens puur theoretisch, want deze functies zullen waarschijnlijk allebei intern een loop doen, wat jouw code waarschijnlijk sneller maakt. :)

[ Voor 54% gewijzigd door NMe op 17-09-2008 01:47 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • MarcoC
  • Registratie: September 2003
  • Laatst online: 22:00
Ah, array_flip kende ik nog niet. Zeer handig _O_. En ik moet het stiekem niet alleen met automerken doen, maar ook met nog een andere kolom uit de database, dus dan is mijne zeker sneller aangezien mijn loop eenmaal doorlopen worden en met die functie tweemaal.

[ Voor 68% gewijzigd door MarcoC op 17-09-2008 01:52 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Als je het vaker dan eens moet doen zou ik er dan wel weer zelf een functie voor maken. :)

Overigens wilde ik hier in de eerste instantie posten dat ik het gek vond dat iedereen altijd lijkt te denken dat overal een standaardfunctie voor is in PHP, tot ik de manual even opentrok om te kijken of dat niet toevallig écht het geval was hier. 8)7

edit:
Trouwens, als je het toch al uit de database haalt én je hebt al een comma separated list met al je ID's, waarom dan niet iets als dit?
SQL:
1
2
3
SELECT `merknaam`
FROM `tabelnaam`
WHERE `id` IN (lijstje_met_IDs_hier)

Dat scheelt je dat hele gezeur in PHP. :)

[ Voor 28% gewijzigd door NMe op 17-09-2008 02:04 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • MarcoC
  • Registratie: September 2003
  • Laatst online: 22:00
Omdat ik al binnen een oorspronkelijke query zit waarmee ik met behulp van een while-loop alle resultaten in een tabel print (while(mysql_fetch_array($query)), dat soort dingen). Als het resultaat van de query meerdere rijen in beslag neemt ken ik geen andere methode dan via de while-loop elke rij 1 voor 1 afgaan. En een while-loop van een MySQL-query in zo'n zelfde loop heb ik nog nooit werkend gekregen :$ .Daarnaast snap ik mysql_fetch_array nooit zo goed omdat je geen array terugkrijgt als je alleen maar $result = mysql_fetch_array($query) terugkrijgt. Een multidimensionale array met daarin de id's als keys lijken me enorm handig, maar volgens mij krijg je dat niet zomaar.

Lang verhaal kort: deze manier werkt en van andere manieren weet ik niet hoe die moeten :P .

[ Voor 33% gewijzigd door MarcoC op 17-09-2008 03:05 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

mysql_fetch_assoc komt daar meer bij in de buurt. ;) Alleen dan inderdaad wel weer per record, en een hele tabel in één keer.

Overigens ben ik ervan overtuigd dat wat jij wil gewoon in je query kan. Als je even omschrijft hoe je tabel eruitziet en wat je als uitvoer wil, dan is er hier vast iemand die je dat uit kan leggen. Dan kan dit een volgende keer vast makkelijker. ;)

[ Voor 7% gewijzigd door NMe op 17-09-2008 03:07 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • MarcoC
  • Registratie: September 2003
  • Laatst online: 22:00
Ok, daar gaan we dan. We hebben een tabel "rallies". Hierin staan wat kolommen met gegevens, waaronder de autotypes, ingevoerd aan de hand van hun id's, komma-gescheiden.

Daarnaast een tabel "autotypes", met als kolommen id, merk, jaar en nog wat informatie. In mijn tabel wil ik per rij informatie uit de tabel "rallies" laten zien. Nu is voor de autotypes "1,3" niet echt duidelijk, dus moeten deze getalletjes omgezet worden tot bruikbare informatie d.m.v. een query uit de tabel "autotypes". Ik denk ook dat het in één query zou moeten kunnen, maar wat dat betreft is mijn kennis te beperkt om het ook daadwerkelijk te doen.

[ Voor 11% gewijzigd door MarcoC op 17-09-2008 03:16 ]


Verwijderd

OK: Haal heel snel die CSV data uit je database en pak een netjes genormaliseerd model ;)

  • Cartman!
  • Registratie: April 2000
  • Niet online
Precies, nooit kommagescheiden dingen (zeker niet met id's) opslaan in een database. Losse tabel en koppelen maar :)

  • MarcoC
  • Registratie: September 2003
  • Laatst online: 22:00
Waarom niet? Een extra tabel is toch veel omslachtiger?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Oh? Haal dan eens alleen de ID's op die in dat veld staan? Of leuker nog: mutaties. Ik wil een ID aan dat lijstje toevoegen of verwijderen. Zelfs alleen kijken of het ID in het lijstje voorkomt trekt nog veel teveel van je database. Er is een reden dat je met een relationele database werkt, alleen heb je blijkbaar niet helemaal door waarom. :)

Lees even iets over databasenormalisatie, want wat je hier probeert te doen is zeg maar het schoolvoorbeeld. Het maakt bovendien het probleem dat je nu had véél makkelijker omdat je niks meer in PHP hoeft te doen, dat kan gewoon in je query. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

MarcoC schreef op woensdag 17 september 2008 @ 12:29:
Waarom niet? Een extra tabel is toch veel omslachtiger?
Zonder die extra tabel had je dit topic niet hoeven openen. ;) Dus zeker niet omslachtiger. :+

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


  • NetForce1
  • Registratie: November 2001
  • Laatst online: 20-09 23:15

NetForce1

(inspiratie == 0) -> true

Cavorka schreef op woensdag 17 september 2008 @ 12:46:
[...]
ZonderMet die extra tabel had je dit topic niet hoeven openen. ;) Dus zeker niet omslachtiger. :+

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • MarcoC
  • Registratie: September 2003
  • Laatst online: 22:00
Hmm, wellicht zal een aparte tabel beter zijn, maar ik vind het eerlijk gezegd niet handiger. Nu heb ik alle informatie over de rally's in 1 record staan, met 1 gekoppelde tabel voor extra informatie. Met een aparte tabel heb ik de informatie over elke rally verspreid staan over 2 tabellen.

  • trinite_t
  • Registratie: Maart 2003
  • Laatst online: 17-09 14:06
Alleen is je koppeling nu niet (makkelijk) via een query op te halen. Als je het wel op een nette manier doet kun je in 1 query al je gegevens uit de database halen. Dit is en sneller en zorgt ervoor dat je niet dat gemier in php hebt met al die lusjes. (ow ja, foreign keys zijn nuttig!)

The easiest way to solve a problem is just to solve it.


  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 22:05
Daarom doe je ook JOINS om die informatie samen te voegen tot bruikbare info. Dat kunnen doen is één van de bestaansredenen voor relationele databases, die je nu teniet doet door het gebruik van een 'database in een database'.

Ga alsjeblieft niet denken dat wat je nu aan het doen bent, handig is. Kijk nog eens goed naar je informatiemodel en ga vooral de boel nog eens goed normaliseren. :)

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

MarcoC schreef op woensdag 17 september 2008 @ 13:15:
Hmm, wellicht zal een aparte tabel beter zijn, maar ik vind het eerlijk gezegd niet handiger.
Ergens op drie kwart van de vorige eeuw hebben meerdere grote geesten zich over dit soort problematiek gebogen en toen is al geconcludeerd dat het handiger is om deze gegevens in aparte tabellen op te slaan en hier relaties tussen te leggen. Op dat moment was de relationele database geboren. Tot op de dag van vandaag is dat nog steeds de meest gebruikte manier van data opslag en heeft het al decennia lang zijn nut bewezen.

Blijkbaar zie jij iets wat de afgelopen 40 jaar over het hoofd gezien is......

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

MarcoC schreef op woensdag 17 september 2008 @ 13:15:
Hmm, wellicht zal een aparte tabel beter zijn, maar ik vind het eerlijk gezegd niet handiger. Nu heb ik alle informatie over de rally's in 1 record staan, met 1 gekoppelde tabel voor extra informatie. Met een aparte tabel heb ik de informatie over elke rally verspreid staan over 2 tabellen.
Klopt, maar dat kun je oplossen met een relatief onbekende maar eigenlijk verbazend nuttige feature van SQL. We noemen het de 'join'.

Professionele website nodig?


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • MarcoC
  • Registratie: September 2003
  • Laatst online: 22:00
Ik had het al opgezocht, het ziet er redelijk handig uit ja :$ . Onthoud ik voor de volgende keer, ik houd nu mijn methode aan :P .

Ander (offtopic) vraagje, maar de manier waarop ik aan die kommagescheden informatie kom is d.m.v. een select menu. Het probleem is dat ik meerdere waardes van de select box via PHP alleen maar kan lezen d.m.v achter de naam van de select box "[]" te zetten. Dit is nogal lelijk, en ik vraag me af of er geen andere mogelijkheid is :S ?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je vindt het lelijk wanneer een lijst van data in lijstvorm doorgegeven wordt? :o

Korter antwoord: nee. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Makkelijk
  • Registratie: November 2000
  • Laatst online: 18:44
Lelijk? Dat is keurige code. Bovendien neem ik aan dat je je code maakt voor de mensen die de output zien, niet voor de mensen die je source gaan bekijken...

Ennehh.. leesvoer voor iedereen die net als jij nog niet helemaal het idee van relationele databases door heeft...

Wikipedia: Relationeel model

Badieboediemxvahajwjjdkkskskskaa


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

MarcoC schreef op vrijdag 19 september 2008 @ 00:06:
Ik had het al opgezocht, het ziet er redelijk handig uit ja :$ . Onthoud ik voor de volgende keer, ik houd nu mijn methode aan :P
Bespaar je al die toekomstige pijn nu asjeblieft en doe het direct goed....

Professionele website nodig?

Pagina: 1