PDA

Volledige versie bekijken : array opvullen met elk item slechts een keer


+oMÁz_
%Europe/Berlin %627 %2007, 16:03
Oď_

De zoekfunctie gaf me een antwoord op de vraag hoe je elke item slechts één keer uit een array haalt. Maar dat is jammergenoeg de vraag niet.
Ik zou van alle adressen uit een database de postcodes in een array willen plaatsen, maar iedere postcode maar een keer.
Dus bij het invoegen van een postcode, checkt de code eerst of dat getal al in de array zit. Dat lukt door de array telkens per postcode opnieuw te doorlopen, maar is er geen kortere manier? Er zijn namelijk nogal veel adressen, en dan telkens de array herlezen is misschien wat te kort door de bocht.

[dus: record uit database halen >> postcode vergelijken met data in array >> postcode al dan niet in array bijplaatsen >> nieuwe record uit database]


Iemand een idee of er een betere procedure is, of ergens een hint?

[cheerio!]

BernardV
%Europe/Berlin %632 %2007, 16:10
Je kunt ook je query zo maken dat hij alleen de postcodes haalt en daar een GROUP BY op gooien.

Anders kun je nog de postcode als key gebruiken in de array, dan overschrijf je gewoon steeds de key weer met een waarde of je telt het aantal en dan heb je de unieke postcodes en een aantal erbij iets als:
<?
$zipcodes = array();

function addZipcode($zip){
if(isset($zipcodes[$zip])) $zipcodes[$zip]++;
else $zipcodes[$zip] = 1;
}
?>

En dan zou je het zo kunnen doorlopen:
<?
foreach($zipcodes as $key=>$value){
echo "Postcode: " . $key . " komt " . $value . " keer voor.\n";
}
?>

+oMÁz_
%Europe/Berlin %662 %2007, 16:54
wow!

dit moet ik allemaal eerst nog eens uitvlooien, maar ziet er alvast rocksolid uit.

ik begin met die GROUP BY
[cheerio]

brossiekoppie
%Europe/Berlin %786 %2007, 19:52
Je hebt ook de functie in_array() die soelaas kan bieden ;) GROUP BY is wel beter uiteraard maar voor niet-db toepassingen bvb

josko
%Europe/Berlin %789 %2007, 19:57
array_unique() is ook nog een optie

+oMÁz_
%Europe/Berlin %791 %2007, 19:59
Oi_

right, met GROUP BY schiet ik al een heel eind op. {En en passant nog meer MySQL stuff geleerd! thx}

Maar de PHP vat ik niet helemaal.
Haal ik daarmee meteen alle adressen op die respectievelijk bij iedere postcode horen?

Zoals ik het nu heb toont hij iedere postcode slechts één keer, en daarnaast -logischerwijze- ook maar één record.
// 1234AB: "eerste adres met die postcode"
// 9876ZY: "eerste adres met die postcode"

Ik zou ze graag allemaal hebben: {vereenvoudigd}
// 1234AB: "eerste adres met die postcode", "tweede adres", "derde adres", ...
// 9876ZY: "eerste adres met die postcode", "tweede adres", "derde adres", ...

<?php

include('configuratie.php');

$query="SELECT adres, postcode FROM adressen GROUP BY postcode";

$resultaat = mysql_query($query) or die(mysql_error());

// Weergave
while($rij = mysql_fetch_array($resultaat)){

echo $rij['postcode']. ": ". $rij['adres'];
//Hier zou ik dus liever iets hebben genre:
//$rij['postcode']. ": ".$rij['adres1metdiepostcode'], $rij['adres2'], $rij['adres3'], ... , ."<br />";

}
?>

Hoe pak ik zoiets aan?

BernardV
%Europe/Berlin %856 %2007, 21:33
Wat ik nu zou doen is een array maken met de postcode als de key en daar weer een nieuwe array in plaatsen. Dus als deze als bestaat dan heb je een array_push(...waardes...) functie met je nieuwe adres en de eerste op die postcode zal iets zijn als array(...waardes..)

Als iemand een ander idee heeft hoor ik het graag (en +oMÁz_ waarschijnlijk ook) :)

josko
%Europe/Berlin %906 %2007, 22:44
Wat ik nu zou doen is een array maken met de postcode als de key en daar weer een nieuwe array in plaatsen. Dus als deze als bestaat dan heb je een array_push(...waardes...) functie met je nieuwe adres en de eerste op die postcode zal iets zijn als array(...waardes..)

Als iemand een ander idee heeft hoor ik het graag (en +oMÁz_ waarschijnlijk ook) :)
Mee eens.

Al denk ik dat dit iets is wat SQL zou moeten krijgen als standaard optie 8)

+oMÁz_
%Europe/Berlin %574 %2007, 14:46
okay,
ik sla weer verder aan het studeren.
ik laat het weten als ik erdoor geraak.
thx!

BernardV
%Europe/Berlin %684 %2007, 17:25
Maar waarom zou je alles in array's willen stoppen.
Je zou het ook gewoon met meerdere database aanroepen kunnen doen.

+oMÁz_
%Europe/Berlin %353 %2007, 09:29
_ollaH

met meerdere database-verzoeken zou het inderdaad moeten lukken, maar met mysql_connect(); kan ik maar één query invoeren; twee queries met een komma tussen worden niet toegestaan.
En als ik eerst een query opbouw (met of zonder mysql_close erachteraan), dan heb ik de indruk dat die tweede query niet meer wordt uitgevoerd.

Ik had ongeveer dit: (heb het bestand momenteel niet bij de hand)


<?php

include('configuratie.php');

//alle winkels met dezelfde postcode ophalen
$query="SELECT adres, postcode FROM adressen GROUP BY postcode";
$resultaat = mysql_query($query) or die(mysql_error());

// verwittig ALLE mensen uit het adressenbestand met dezelfde postcode als die van een winkel:
while($rij = mysql_fetch_array($resultaat)){
$postcode=$rij['postcode'];
$query2="SELECT emailadres FROM klanten WHERE postcode='".$postcode."'";
$resultaat2 = mysql_query($query2) or die(mysql_error());

while($rij2 = mysql_fetch_array($resultaat2)){
//insert $rij2['email'] in een array

}

//verzend in een keer een email naar alle adressen in de array

}

//en vanaf hier zouden dan de volgende geGROUPeerde winkels met eenzelfde postcode opgehaald moeten worden; opnieuw de klanten met zelfde postcode in array plaatsen en uiteindelijk mailen,... enz. enz.

Je kan je afvragen of er geen eenvoudigere manier is om klanten op de hoogte te houden. In dit geval wisselt het aantal winkels in de lijst van adressen wekelijks, dus daarom moet er telkens opnieuw gekeken worden welke winkels en welke postcodes er zijn.
?>


nog dit: ik ben niet zo heel erg zeker of ik de combinatie GROUP BY / WHILE lus op de juiste manier hanteer.

Hints voor better practices zijn meer dan welkom.

josko
%Europe/Berlin %839 %2007, 21:09
Ik zou de query's samenkoppelen, dmv een INNER JOIN :)

SELECT
adressen.adres,
adressen.postcode,
klanten.emailadres
FROM
adressen
INNER JOIN
klanten
ON
klanten.postcode = adressen.postcode
GROUP BY
klanten.postcode

Artikel over joins:
http://www.phpfreakz.nl/artikelen.php?aid=45


--- edit:
Nee, dat werkt zo niet :P

Maar het kan wél in een keer, door een IN :)
SELECT
adressen.adres,
adressen.postcode,
klanten.emailadres
FROM
adressen
INNER JOIN
klanten
ON
klanten.postcode
IN(
SELECT
postcode
FROM
adressen
GROUP BY
postcode
) ;

+oMÁz_
%Europe/Berlin %876 %2007, 22:01
ow dude!_

tailormade mysql; you're the man!
IN, ON, haakjes. Allemaal nieuw voor me. Ga ik meteen uitproberen.

[cheers!]

josko
%Europe/Berlin %944 %2007, 23:39
Ik weet eigenlijk niet zeker of INNER JOIN + een IN werkt :P

ON is een vervanging voor WHERE binnenin de join :)