<?php
$query_input = [
'_or'=>[
['cats'=>1],
['dogs'=>1]
]
];
$results = [
['id'=>0,'cats'=>0,'dogs'=>0],
['id'=>1,'cats'=>0,'dogs'=>0,'lizards'=>3],
['id'=>2,'cats'=>0,'dogs'=>1],
['id'=>3,'cats'=>1,'dogs'=>0],
['id'=>4,'cats'=>1,'dogs'=>1]
];
// hackkk both the filter and find methods need significant cleanup
if (isset($query_input['_or'])) {
foreach ($query_input['_or'] as $key=>$value) {
$query_where[] = [$key, '_OR', null];
}
}
$out = [];
$skip = [];
foreach ($results as $result) {
foreach ($query_where as $where) {
list($key, $comp, $value) = $where;
if (!isset($result[$key])) {
$skip = ['!isset', $key];
continue;
} // the data is not in the result, skip check
switch ($comp) {
case '_OR':
foreach ($query_input['_or'][$key] as $or_item) {
foreach ($or_item as $comp_key=>$comp_value) {
if ($result[$comp_key] != $comp_value) {
echo 1;
continue(2);
}
}
echo 2;
break; // as long as the script hits here, the result will be kep
}
break;
case '=':
if ($result[$key] != $value) {
$skip[] = [$result[$key],$value,'=',$key];
continue(3);
}
break;
case 'LIKE':
$pos = strpos($value,'%');
if ($pos===false) $pos = strlen($value);
if (substr($result[$key],0,$pos) !== substr($value,0,$pos)) {
$skip[] = [$result[$key],$value,'LIKE',$key];
continue(3);
}
break;
}
}
$out[] = $result;
}
var_dump($out);
preferences:
42.44 ms | 402 KiB | 5 Q