- jensm
- Medlem ●
- Boden
- 2011-08-18 14:14
Hej. Har lyckats snickra ihop en sökfunktion, men den är otroligt långsam (20 sek i IE på en äldre PC).
Jag antar att, även om jag fått det att funka, har gjort helt fel.
Man fyller i ett formulär, och utifrån det genereras en URL som man skickas vidare till. Inget konstigt här väl? Detta för att sidan man skickas till ska veta vad man sökt efter.
Sökvariablerna hämtas från URLen:
$sok_marke = $_GET[ 'ma' ]; $sok_modell = $_GET[ 'mo' ]; $sok_karosseri = $_GET[ 'ka' ]; $sok_ar_fran = $_GET[ 'af' ]; $sok_ar_till = $_GET[ 'at' ]; $sok_pris_fran = $_GET[ 'pf' ]; $sok_pris_till = $_GET[ 'pt' ]; $sok_mil_fran = $_GET[ 'mf' ]; $sok_mil_till = $_GET[ 'mt' ]; $sok_drivmedel = $_GET[ 'dr' ]; $sok_vaxellada = $_GET[ 'va' ];
Databasen är i form av en XML. Jag använder cURL för att ladda XMLen eftersom den är på extern server. Sen använder jag SimpleXML för att göra om XMLen till en array:
foreach($xml->car as $car) { $acar = array( 'image' => $car->thumbs->image[1], 'yearmodel' => $car->yearmodel, 'miles' => $car->miles, 'price' => $car->{'price-sek'}, 'model' => $car->model, 'brand' => $car->brand, 'modeldescription' => $car->modeldescription, 'info' => $car->{'info'}, 'id' => $car->id, 'bodytype' => $car->bodytype, 'fueltype' => $car->fueltype, 'gearboxtype' => $car->gearboxtype, ); $cararray[] = $acar; }
Nu har jag alltså en Array (cararray). För att plocka fram datan som matchar sökningen har jag en kanske lite för lång foreach loop (tror det är denna som slöar ner).
foreach( $cararray as $thiscar ) { if(("$thiscar[brand]" == $sok_marke || $sok_marke == 'Alla') && ("$thiscar[model]" == $sok_modell || $sok_modell == 'Alla') && ("$thiscar[bodytype]" == $sok_karosseri || $sok_karosseri == 'Alla') && (("$thiscar[yearmodel]" >= $sok_ar_fran || $sok_ar_fran =='null') && ("$thiscar[yearmodel]" <= $sok_ar_till || $sok_ar_till =='null')) && (("$thiscar[price]" >= $sok_pris_fran || $sok_pris_fran =='null') && ("$thiscar[price]" <= $sok_pris_till || $sok_pris_till =='null')) && (("$thiscar[miles]" >= $sok_mil_fran || $sok_mil_fran =='null') && ("$thiscar[price]" <= $sok_mil_till || $sok_mil_till =='null')) && ("$thiscar[fueltype]" == $sok_drivmedel || $sok_drivmedel == 'Alla') && ("$thiscar[gearboxtype]" == $sok_vaxellada || $sok_vaxellada == 'Alla') ){ echo ("Här är kod för att skriva ut resultatet i form av en DIV, en if loop, om bild inte finns visas en "ingen bild finns-bild" med mera); }
Detta är väl inte rätta vägen att gå? När man plockar ut alla inlägg i XMLen och lägger i en array, kan man välja att bara plocka ut den data som matchar sökningen? På så sätt slipper man den gigantiska foreach / if loopen som rensar bland resultaten. Skulle det snabba upp sökningen? Hur skulle en sådan snutt kod kunna se ut?
Tack så mycket på föhand!