PDA

Volledige versie bekijken : Zoeken in een php array


renegeuze
%Europe/Berlin %482 %2009, 12:34
Hoi,

Ik ben bezig met een interne zoekfunctie op een website met instant zoekresultaten en het werkt op zich allemaal prima maar op 1 punt kom ik er niet uit zoals ik dat zou willen.
Ik zal jullie niet lastigvallen met wat die zoekbox allemaal al wel kan en alleen maar even een korte uitleg geven op 2 onderdelen.

1 onderdeel is het zoeken naar namen van geregistreerde gebruikers in een bestaande database.
Ik ben geen php guru maar daar heb ik het volgende voor in elkaar weten te knutselen.
function findUsers($find,$limit=15){
$search = "user_name LIKE '%%' ";
if($arr = explode(" ", $find)){
foreach ($arr as $str){
$search .= "AND user_name LIKE '%{$str}%' ";
}
}
$res = mysql_query("SELECT user_name,id FROM rankings_personal WHERE {$search} ORDER BY user_name LIMIT {$limit}");
$found[] = array();
while ($item = mysql_fetch_assoc($res)){
$found[] = array("type"=>"user","id"=>$item['id'],"name"=>$item['user_name']);
}
return $found;
}
Dit werkt dus wel en is ongeveer het doel.

Het 2e onderdeel is het probleem.
Ik wil een zelfde functie in elkaar "hacken" maar dan niet voor een database maar een array in php.
Belangrijk is dus dat spaties eigenlijk worden gezien als "AND string contains ..."

Tot nog toe kom ik niet verder dan een OR string contains.

Is er iemand die mij kan helpen?8~
Stel dat alle php oplossing die kunnen worden verzonnen "zwaarder" zijn voor de server dan een simpele DB query of meer dan 50 regels code zijn dan ga ik dit gewoon omzetten naar een tabel. Maar liever niet.

Hier de code zoals ik dat nu heb. Commented out is de OR versie.

function findPages($find,$limit=15){
$found[] = array();
$pages = array(
'tribe' => array(
'url' => HOST.'tribe/',
'name' => 'Tribe',
'keys' => 'tribe'
),
'tribenews' => array(
'url' => HOST.'news/tribe/',
'name' => 'Tribe News',
'keys' => 'tribenews'
),
'guide' => array(
'url' => HOST.'guide/',
'name' => 'Guide',
'keys' => 'guide help'
)
);
$i = 0;
foreach($pages as $page){
/*
if($pieces = explode(" ", $find)){
foreach($pieces as $piece){
if(stristr($page['keys'],$piece)){
$found[$i] = array("type"=>"page","page"=>$page['name'],"url"=>$page['url']);
}
}
}
$i++;
*/
if(stristr($page['keys'],$find)){
$found[] = array("type"=>"page","page"=>$page['name'],"url"=>$page['url']);
}
}
return $found;
}

Hulp bij het mooier maken van de eerste functie is uiteraard ook welkom ;)

Alvast bedankt!

Koen!
%Europe/Berlin %491 %2009, 12:47
Snelle fix:
if($pieces = explode(" ", $find)){
$foundpiece = false;
foreach($pieces as $piece){
$foundpiece = $foundpiece&&stristr($page['keys'],$piece);
}
if($foundpiece){
$found[$i] = array("type"=>"page","page"=>$page['name'],"url"=>$page['url']);
}
}
$i++;

renegeuze
%Europe/Berlin %504 %2009, 13:06
Ziet er al veel beter uit en ik wou al gaan juichen dat dit echt super is.
Ik weet niet of het daar betekenis kan hebben maar $foundpiece&& deed weinig en ik heb dan maar weggehaald. Daarna lijkt het dus te werken maar het gaat weer mis als ik bijvoorbeeld "tribe guide" typ.
Dan krijg ik dus het resultaat van tribe(niet van news erbij) en van de guide. Waardoor het er op neer komt dat er weer een soort van OR in zit :(

Zitten er regex lookaheads in (de nieuwe versies van) php? Nog nooit gevonden maar dat kan volgens mij ook een oplossing zijn.
Iets als match(geen_idee_of_deze_klopt_en_ik_heb_ook_nog_no oit_met_lookaheads_gewerkt) /^((?=piece1)(?=piece2)(?=piece3))/i

Koen!
%Europe/Berlin %553 %2009, 14:17
Als het goed is wél werkende fix:
if($pieces = explode(" ", $find)){
$foundpiece = true;
foreach($pieces as $piece){
$foundpiece = $foundpiece&&stristr($page['keys'],$piece);
}
if($foundpiece){
$found[$i] = array("type"=>"page","page"=>$page['name'],"url"=>$page['url']);
}
}
$i++;Sorry, $foundpiece had niet op false geinitialiseerd moeten worden (want dan wordt $foundpiece nooit true). ;)

Die regex lookaheads weet ik niet zeker, maar zou je dan niet ook op alle permutaties moeten checken?

renegeuze
%Europe/Berlin %592 %2009, 15:13
Fantastisch. Ik heb ook nog even uit zitten zoeken wat $var&& hier nou doet, ik kende het helemaal nog niet.

En met regex lookaheads, ja dat weet ik dus niet met lookaheads. Eigenlijk wil je constant weer vanaf ^ een lookahead doen en niet vanaf de vorige lookahead. Ik weet niet wat default behaviour is. Misschien een (lookahead|lookbehind) combo.
Maarja, dit werkt en er is dus geen enkele reden om nu naar regex te gaan :D

Koen!
%Europe/Berlin %612 %2009, 15:41
Fantastisch. Ik heb ook nog even uit zitten zoeken wat $var&& hier nou doet, ik kende het helemaal nog niet.
"&&" is een logische AND. ;)