CrossUp Posted April 16, 2014 Report Share Posted April 16, 2014 (edited) Esmu uzrakstījis funkciju, kura izveido dropdown tipa izvēlni. Vērtības tiek ņemtas no datubāzes. Šo sarakstu ir iespējams papildināt ar neierobežotu skaitu vērtībām, tam arī ir attiecīga forma, vienīgie nosacījumi jaunu vērtību ieviešanai ir tādi, ka ievades laukos (ar javascript palīdzību ģenerēti form_input lauki) nedrīkst atrasties divi vienādi nosaukumi vai tie nedrīkst jau atrasties datubāzē. Ideja ir tāda, ka tiek paņemts pirmais (0) vārds un salīdzināts ar visiem pārējiem vārdiem ievades masīvā, ja to atrod vēl vismaz 1 reizi, tad funkcija atgriež false vērtību, ja ievadītajā masīvā meklētais vārds neatkārtojas, tad to meklē datubāzē, ja arī tur neatkārtojas to ieliek citā masīvā. Ja vārds kura dublikātu meklē ir ievadīts vēl vismaz 1 reizi, tad vārds jaunajā masīvā netiek saglabāts un pointeris pārbīdas par 1 pozīciju uz priekšu un sāk meklēt tādā pašā secībā jauno atbilstību. Mans kods: //$length1 = $post masīva garums //$length2 = DB esošā masīva garums //$num1 pointeris $post masīvam //$array1 = $post masīvs //array2 = DB esošais masīvs //masīvu noklusētās vērtības ir NULL, jo tie var būt tukši (tā vieglāk kļūdu noteikt) public function search_if_exists($length1, $length2, $num, &$array1 = NULL, &$array2 = NULL){ $error_post = 'Kļūda ar $post masīvu.'; $error_db = 'Kļūda ar datubāzes masīvu'; //Ja neizdodas iegūt $post masīvu nav jēga turpināt if($array1===NULL){return $error_post;} //Tiek veikta pārbaude $post masīvā esošo dublikātu noskaidrošanai for($length1; $num!=$length1; ){ if($array1['title'][$num]===$array1['title'][$length1]){ //Ja ir dublikāti neturpinam return true; }else{ //Ja nav pārbīdam pointeri par 1 pozīciju atpakaļ $post masīvam $length1-=1; } } //Ja neizdodas iegūt db esošo masīvu nav jēgas turpināt if($array2===NULL){ return $error_db; } //Tiek veikta pārbaude DB esošo ierakstu noskaidrošanai //(pēc noklusējuma vienmēr būs 1 ieraksts, ar kuru salīzināšana netiek veikta) elseif($length2<=1){ return false; }else{ //Līdzīgi kā pirmajā ciklā tiek veikta pārbaude no $post masīva vārdiem //datubāzē esošo dublikātu noskaidrošanai. Šajā pārbaudē jau tiek pašsaprotami //pieņemts fakts, ka netika ievadīti dublikāti for($length2; $num!=$length2; ){ if($array1['title'][$num]===$array2[$length2]['title']){ return true; }else{ $length2 -=1; if($num===$length2){ return false; } } } } } Brīdī, kad mēģinu izsaukt šo funkciju pārlūks atrodas 'loading' statusā, nav īsti saprotams pat kur kļūda iemetusies. Ja manai problēmai jau ir izdomāts risinājums lūdzu padalieties ar informāciju, vēlos to aplūkot, bet pa lielam gribās pašam izdomāt. Edited April 16, 2014 by CrossUp Quote Link to comment Share on other sites More sharing options...
codez Posted April 16, 2014 Report Share Posted April 16, 2014 (edited) Izmantojam masīvus kā hash tabulu, respektīvi vērtības rakstam indeksa vietā: Pārbaudam vai vērtība eksistē ar isset, pieliekam papildus ar $arr[$vertiba]=1. Gadijumā, ja mēģinās pielikt vairākus vienādus, tie vienkārši pārklāsies kā viens ieraksts. http://codepad.org/4FEdxqe3 <?php $arr = array( "pērkons" => 1, "saule" => 1, "zeme" => 1, "zobens" => 1 ); echo isset($arr['saule'])? "ir" : "nav"; echo "\n"; echo isset($arr['koks'])? "ir" : "nav"; echo "\n"; echo isset($arr['zeme'])? "ir" : "nav"; echo "\n"; $arr['koks']=1; echo isset($arr['koks'])? "ir" : "nav"; echo "\n"; foreach($arr as $key=>$val){ echo $key." "; } Saprotams, ka ir arī funkcija in_array, kura nosaka, vai vērtība ir masīvā, bet tā izpildes sarežģītība ir O(N), kamēr isset amortizētais O(1) un nav jāveic papildus pārbaudes dublikātu noskaidrošanai viena masīva ietvaros. Edited April 16, 2014 by codez Quote Link to comment Share on other sites More sharing options...
CrossUp Posted April 16, 2014 Author Report Share Posted April 16, 2014 Paldies par atbildi, ideja ir skaidra, nav skaidrība kā man īsti tos savus masīvus tagad pārveidot, lai $key būtu meklējamais vārds un $value būtu boolean (1 vai 0) vērtība. Mani masīvi (vārdi tur ir sakarīgi, nav UTF-8 kodējums, jo izmantoju die; funkciju): Post data: array (size=2)'title' =>array (size=6)0 => string 'viens' (length=5)1 => string 'divi' (length=4)2 => string 'trÄ«s' (length=5)3 => string 'Äetri' (length=6)4 => string 'pieci' (length=5)5 => string '' (length=0)'add' => string 'Pievienot' (length=9) Gallery data: array (size=7)0 =>array (size=2)'title' => string 'cepums' (length=6)'project_id' => string '15' (length=2)1 =>array (size=2)'title' => string 'divi' (length=4)'project_id' => string '15' (length=2)2 =>array (size=2)'title' => string 'ola' (length=3)'project_id' => string '15' (length=2)3 =>array (size=2)'title' => string 'Projekta galvenÄ' (length=17)'project_id' => null4 =>array (size=2)'title' => string 'trÄ«s' (length=5)'project_id' => string '15' (length=2)5 =>array (size=2)'title' => string 'viens' (length=5)'project_id' => string '15' (length=2) Quote Link to comment Share on other sites More sharing options...
codez Posted April 16, 2014 Report Share Posted April 16, 2014 (edited) Vari pats uzrakstit vienkārsu foreach ciklu vai izmantot iebūvēto php funkciju array_flip http://codepad.org/kaCczMfE $arr=array("viens","divi","viens","tris","cetri","divi","pieci"); $arr2=array(); foreach($arr as $val) $arr2[$val]=1; foreach($arr2 as $key => $val) echo $key." "; echo "\n"; $arr3=array_flip($arr); foreach($arr3 as $key => $val) echo $key." "; P.S. Ja gribi, lai ir hashmaps ar konkrētu norādi uz visiem datiem, tad var izmantot value daļu, lai key vērtībai piesaistītu visu ierakstu: http://codepad.org/IfHH5HMg <?php $arr=array( array("title"=>"viens", "project_id"=>6), array("title"=>"divi", "project_id"=>8), array("title"=>"tris", "project_id"=>3), array("title"=>"cetri", "project_id"=>4), array("title"=>"pieci", "project_id"=>5) ); $arr2=array(); foreach($arr as $val) $arr2[$val['title']]=$val; foreach($arr2 as $key=>$val){ echo $key." ".$val['project_id']."\n"; } Edited April 16, 2014 by codez Quote Link to comment Share on other sites More sharing options...
CrossUp Posted April 22, 2014 Author Report Share Posted April 22, 2014 Paldies par ideju, viss strādā ideāli un kods arī nav nemaz sarežģīts. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.