login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Zoekfunctie die (recursief) door arrays zoekt

Offline ikki007 - 15/01/2010 14:58
Avatar van ikki007Gouden medailleGouden medaille

PHP ver gevorderde
Hoi,

Normaliter heb ik de pagina's en content die geindexeerd is voor de zoekfunctie in een database opgeslagen.
Echter nu heb ik het in een array ($lang) staan ivm statische pagina's en language files.
Mijn vraag is, hoe gaat het zoeken binnen een array precies in zijn werk.
  1. <?php
  2. // voorbeeld
  3. $lang = array();
  4.  
  5. $lang['en'] = 'Monkeys are in the tree.';
  6. $lang['nl'] = 'Er zitten apen in de bomen';
  7. ?>


Nu moet het zo gaan dat als men op "monkeys" zoekt, hij $lang['en'] retourneert, en als men op "monkeys bomen" zoekt, dat zowel $lang['en'] als $lang['nl'] geretourneerd moet worden, zoekwoorden gescheiden door spatie dus.

Is zoiets mogelijk?

Ikki.

8 antwoorden

Gesponsorde links
Offline ArieMedia - 15/01/2010 15:51
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
Waarom wil je dit recursief doen eigenlijk?
kan je niet gewoon een foreach op de woorden doen en dan zoeken in de taal?
Offline ikki007 - 15/01/2010 17:34
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Ik bedenk me nu dat recursief niet nodig is. Aangezien ik een array maak met alle geindexeerde waardes (en dus geen arrays in array meer etc.).

Een foreach en dan telkens een preg match uitvoeren is een goede, maar ik ben niet thuis in regexes, dus heb geen idee hoe ik dit precies moet aanpakken.

Ik zat zelf aan zoiets te denken.

  1. <?php
  2. $indexed = array(); // bevat veel values
  3. $zoekwoorden = explode(' ', $input);
  4.  
  5. $results = array();
  6.  
  7. foreach($indexed as $val) {
  8. if(een zoekwoord voorkomt in $val) {
  9. $results[] = $val;
  10. }
  11. }


Nu moet ik alleen even uitzoeken wat er precies in die if moet komen. Iemand enig idee?
Als zoekwoord geen array was kon ik strpos doen, maar nu zie ik het niet.
Offline Abbas - 15/01/2010 18:11
Avatar van Abbas Gouden medaille

Crew .NET
Iets als:

  1. if(in_array($val, $zoekwoorden))

Offline ikki007 - 15/01/2010 18:36
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Nee want als je dan de string "aapjes zitten in bomen" hebt, en je vult als zoekwoorden "aapjes bomen" in, dan zal hij nooit matchen want aapjes != aapjes zitten in bomen, en hetzelfde geld voor bomen.

$val bevat vrij grote teksten, waar in gezocht moet kunnen worden
Offline Martijn - 15/01/2010 19:04
Avatar van Martijn Crew PHP in je foreach een explode $val op spatie, en dan if(in_array($zoekArray,$explodeVal)){}
Offline ikki007 - 15/01/2010 19:05
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Martijn schreef:
in je foreach een explode $val op spatie, en dan if(in_array($zoekArray,$explodeVal)){}


Ja, aan deze mogelijkheid had ik ook gedacht, alleen is niet heel intensief? (En dan bedoel ik zó intensief dat het een grote impact heeft)
Offline ArieMedia - 15/01/2010 19:19 (laatste wijziging 15/01/2010 19:22)
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
Ik had toch niks te doen..

Misschien dat het korter kan, maar je hebt iniedergeval een idee hoe het kan 

  1. <?php
  2.  
  3. $aLang['en'] = 'Monkeys are in the tree.';
  4. $aLang['nl'] = 'Er zitten apen in de bomen';
  5.  
  6. $aRetLang = array();
  7. echo 'De volgende zinnen kan je op zoeken<pre>'.print_r($aLang, 1).'</pre>';
  8.  
  9. if(isset($_POST['zoek'])) {
  10. echo '<h2>ZOEK OP '.$_POST['zoekstring'].'</h2>';
  11. $sZoekString = $_POST['zoekstring'];
  12. $aWoorden = explode(' ', $sZoekString);
  13. foreach($aWoorden as $sWoord) {
  14. foreach($aLang as $sTaal => $sZin) {
  15. echo 'Checking '.$sTaal.' -> '.$sWoord;
  16. if(strpos($sZin, $sWoord) !== false) {
  17. if(!in_array($sTaal, $aRetLang)) {
  18. $aRetLang[] = $sTaal;
  19. }
  20. }
  21.  
  22. echo '<br>';
  23. }
  24. }
  25.  
  26. echo '<h2>Return deze talen:</h2><pre>'.print_r($aRetLang, 1).'</pre>';
  27. }
  28.  
  29.  
  30. echo '<form method="post" action="test.php">
  31. Zoek: <input name="zoekstring" type="text">
  32. <input type="submit" name="zoek" value="Zoek!">
  33. </form>';
  34.  
  35. ?>


Zoals je ziet heb je geen regex nodig.

Edit: Code Update + testpagina van mij
Offline ikki007 - 15/01/2010 19:22
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Ja zoiets heb ik nu ook:

  1. <?php
  2. $keywords = explode(' ', $_POST['keywords']);
  3.  
  4. $results = array();
  5.  
  6. foreach($indexed as $data) {
  7. $_data = explode(' ', $data);
  8.  
  9. foreach($keywords as $keyword) {
  10. if(in_array($keyword, $_data)) {
  11. $results[] = $data;
  12. break;
  13. }
  14. }
  15. }


Maar nu zit ik weer te twijfelen of ik de input als keywords of als een string wil beschouwen  
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.223s