I was trying to figure out how to organize the shiurim in a way that allowed for "AND" filters; something like
The archive filter is now basically:
So
just as we wanted,
and
Perfect!
The "1 AND" at the beginning makes the coding easier. The actual code is a bit more involved, to prevent cross-site scripting and to limit the filters to specific items.
author=shulman&tag=audio&tanach. Regular expressions won't work; but PHP allows you to use [] after a name and it automatically creates an array, so author=shulman&tag[]=audio&tag[]=tanach works (tag=audio&tag=tanach just overwrites the first tag).The archive filter is now basically:
function shiurquery($get){
$ret = '1';
foreach($get as $query=>$item) $ret .= shiurquerystring($item, $query." REGEXP");
return $ret;
}
function shiurquerystring ($item, $query){
if (is_array($item))
return join (' AND ', array_map ('shiurquerystring', $item, array_fill(0, count($item), $query)));
return "$query\"$item\"";
}
Where shiurquerystring uses array_map to recursively analyze each element of the array.
It's a bit obscure but works, and tighter than a for-each loop.So
shiurquerystring("shulman", "author REGEXP",) returns 'author REGEXP "shulman"' and
shiurquerystring(array("Tanach", "Audio"), "tag REGEXP") returns 'tag REGEXP "Tanach" AND tag REGEXP "Audio"',just as we wanted,
and
shuirquery(parse_str("author=shulman&tag[]=Audio&tag[]=Tanach") returns'1 AND author REGEXP "shulman" AND tag REGEXP "Audio" AND tag REGEXP "Tanach'.Perfect!
The "1 AND" at the beginning makes the coding easier. The actual code is a bit more involved, to prevent cross-site scripting and to limit the filters to specific items.

Leave a Reply