Improved www.ttss.krakow.pl
Jacek Kowalski
2017-04-12 68aeb4a997a99ac7dde426ad7a3c87205b4f89d2
stops.php
@@ -8,7 +8,7 @@
   if(empty($_GET['query'])) throw new UnexpectedValueException();
   if(strlen($_GET['query']) > 50) throw new UnexpectedValueException();
   
   // Initialize DB connection an query
   // Initialize a DB connection an a query
   $pdo = new PDO('sqlite:stops/stops.db', NULL, NULL, array(
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
   ));
@@ -17,7 +17,7 @@
   // Split stop name into words
   $words = split_stop_name($_GET['query']);
   
   // Find relevant stop IDs
   // Find matching stops (their IDs)
   $ids = NULL;
   foreach($words as $word) {
      if(empty($word)) continue;
@@ -27,10 +27,11 @@
      $results = $st->fetchAll(PDO::FETCH_COLUMN);
      $st->closeCursor();
      
      // Merge results with previous searches
      if(is_array($ids)) {
         // Merge results with list for previous words
         $ids = array_intersect($ids, $results);
      } else {
         // First search - initialize results list
         $ids = $results;
      }
      
@@ -38,26 +39,32 @@
      if(count($ids) == 0) break;
   }
   
   // Close DB connection
   // Close a DB connection
   unset($st, $pdo);
   
   // No query was executed
   // No query was executed - return empty list
   if(!is_array($ids)) throw new UnexpectedValueException();
   
   // Build structure for UI
   // Build a structure for the UI
   $stop_list = [];
   $query_lower = mb_strtolower($_GET['query'], 'UTF-8');
   foreach($ids as $id) {
      $stop_list[] = [
         'id' => $id,
         'name' => $stops[$id],
         'type' => 'stop',
         'relevance' => similar_text($_GET['query'], $stops[$id])
         'relevance' => similar_text(
            $query_lower,
            mb_strtolower($stops[$id], 'UTF-8')
         )
      ];
   }
   
   // Sort stops by relevence
   // Sort stops by relevance
   usort($stop_list, function($a, $b) {
      return $b['relevance'] - $a['relevance'];
      $rel = $b['relevance'] - $a['relevance'];
      if($rel == 0) return strcasecmp($a['name'], $b['name']);
      return $rel;
   });
   
   // Return JSON