Jump to content
php.lv forumi

Man ir meklēšanas algoritms, kas nestrādā.


CrossUp

Recommended Posts

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 by CrossUp
Link to comment
Share on other sites

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 by codez
Link to comment
Share on other sites

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' => null
4 =>
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)

Link to comment
Share on other sites

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 by codez
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...