function rcFilterByCategories(&$rows, $categories, $any)
{
    # Filter categories
    $cats = array();
    foreach ($categories as $cat) {
        $cat = trim($cat);
        if ($cat == "") {
            continue;
        }
        $cats[] = $cat;
    }
    # Filter articles
    $articles = array();
    $a2r = array();
    foreach ($rows as $k => $r) {
        $nt = Title::newFromText($r->rc_title, $r->rc_namespace);
        $id = $nt->getArticleID();
        if ($id == 0) {
            continue;
        }
        # Page might have been deleted...
        if (!in_array($id, $articles)) {
            $articles[] = $id;
        }
        if (!isset($a2r[$id])) {
            $a2r[$id] = array();
        }
        $a2r[$id][] = $k;
    }
    # Shortcut?
    if (count($articles) == 0 or count($cats) == 0) {
        return;
    }
    # Look up
    $c = new Categoryfinder();
    $c->seed($articles, $cats, $any ? "OR" : "AND");
    $match = $c->run();
    # Filter
    $newrows = array();
    foreach ($match as $id) {
        foreach ($a2r[$id] as $rev) {
            $k = $rev;
            $newrows[$k] = $rows[$k];
        }
    }
    $rows = $newrows;
}
 /**
  * Filter $rows by categories set in $opts
  *
  * @param array $rows Database rows
  * @param FormOptions $opts
  */
 function filterByCategories(&$rows, FormOptions $opts)
 {
     $categories = array_map('trim', explode('|', $opts['categories']));
     if (!count($categories)) {
         return;
     }
     # Filter categories
     $cats = array();
     foreach ($categories as $cat) {
         $cat = trim($cat);
         if ($cat == '') {
             continue;
         }
         $cats[] = $cat;
     }
     # Filter articles
     $articles = array();
     $a2r = array();
     $rowsarr = array();
     foreach ($rows as $k => $r) {
         $nt = Title::makeTitle($r->rc_namespace, $r->rc_title);
         $id = $nt->getArticleID();
         if ($id == 0) {
             continue;
             # Page might have been deleted...
         }
         if (!in_array($id, $articles)) {
             $articles[] = $id;
         }
         if (!isset($a2r[$id])) {
             $a2r[$id] = array();
         }
         $a2r[$id][] = $k;
         $rowsarr[$k] = $r;
     }
     # Shortcut?
     if (!count($articles) || !count($cats)) {
         return;
     }
     # Look up
     $c = new Categoryfinder();
     $c->seed($articles, $cats, $opts['categories_any'] ? 'OR' : 'AND');
     $match = $c->run();
     # Filter
     $newrows = array();
     foreach ($match as $id) {
         foreach ($a2r[$id] as $rev) {
             $k = $rev;
             $newrows[$k] = $rowsarr[$k];
         }
     }
     $rows = $newrows;
 }