X-Git-Url: https://git.mxchange.org/?p=core.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Fcriteria%2Fsearch%2Fclass_SearchCriteria.php;h=170986c0caf9efc6899ac670cf1e23247189b3ea;hp=8d770f3ee4d0a2030df70602362467540b04546d;hb=30b7d2640709bbec4cac06ddc7c5d1dddb997a1c;hpb=6b2a7074aee52128919afc159f1df3ba8f1a5515 diff --git a/inc/classes/main/criteria/search/class_SearchCriteria.php b/inc/classes/main/criteria/search/class_SearchCriteria.php index 8d770f3e..170986c0 100644 --- a/inc/classes/main/criteria/search/class_SearchCriteria.php +++ b/inc/classes/main/criteria/search/class_SearchCriteria.php @@ -120,28 +120,83 @@ class SearchCriteria extends BaseCriteria implements LocalSearchCriteria { * * @param $key Key element to check * @param $value Value to check + * @param $separator Separator for "exploding" $value (default: ',') * @return $isMatching Whether the key/value is matching or excluded */ - public function isCriteriaMatching ($key, $value) { + public function isCriteriaMatching ($key, $value, $separator = ',') { + // $value cannot be array + assert(!is_array($value)); + + // "Explode" value + $valueArray = explode($separator, $value); + + // Debug message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SEARCH-CRITERIA[' . __LINE__ . ']: key=' . $key . ',value=' . $value . ' - ENTERED!'); + // Get 'default' search value - $search = $this->getCriteriaElemnent($key); + $searchDefault = $this->getCriteriaElemnent($key); + + // Debug message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SEARCH-CRITERIA[' . __LINE__ . ']: getCriteriaElement(' . $key . ')[' . gettype($searchDefault) . ']=' . $searchDefault); // 'default' check - $isMatching = ((!is_null($search)) && ($search == $value)); + $isMatching = ((!is_null($searchDefault)) && ($searchDefault == $value)); - // Get 'choice' search value (can be NULL or comma-separated string) - $search = $this->getCriteriaChoiceElemnent($key); + // Debug message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SEARCH-CRITERIA[' . __LINE__ . ']: getCriteriaElement(' . $key . ')[' . gettype($searchDefault) . ']=' . $searchDefault . ',isMatching=' . intval($isMatching)); + + // Get 'choice' search value (can be NULL or $separator-separated string) + $searchChoice = $this->getCriteriaChoiceElemnent($key); + + // Debug message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SEARCH-CRITERIA[' . __LINE__ . ']: getCriteriaChoiceElement(' . $key . ')[' . gettype($searchChoice) . ']=' . print_r($searchChoice, TRUE)); // 'choice' check - $isMatching = (($isMatching === TRUE) && ((is_null($search)) || (in_array($value, explode(',', $search))))); + if ((is_array($searchChoice)) && (count($valueArray) == 1)) { + // $value is a single-search value, so use in_array() + $isMatching = ((($isMatching === TRUE) || (is_null($searchDefault))) && ((is_null($searchChoice)) || ((is_array($searchChoice)) && (in_array($value, $searchChoice))))); + + // Debug message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SEARCH-CRITERIA[' . __LINE__ . ']: getCriteriaChoiceElement(' . $key . ')[]=' . gettype($searchChoice) . ',value=' . $value . ',isMatching=' . intval($isMatching) . ' - SINGLE-MATCH'); + } elseif ((is_array($searchChoice)) && (count($valueArray) > 1)) { + // $value is choice-search value, so check all entries + $isMatching = ((is_null($searchDefault)) || ($isMatching === TRUE)); + $idx = 0; + foreach ($valueArray as $idx => $match) { + // Debug message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SEARCH-CRITERIA[' . __LINE__ . ']: match=' . $match . ',count(searchChoice)=' . count($searchChoice)); + + // Is it found? (one is okay) + $isMatching = (($isMatching === TRUE) && (in_array($match, $searchChoice))); + + // Debug message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SEARCH-CRITERIA[' . __LINE__ . ']: match=' . $match . ',isMatching=' . intval($isMatching)); + } // END - foreach + + // Debug message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SEARCH-CRITERIA[' . __LINE__ . ']: getCriteriaChoiceElement(' . $key . ')[]=' . gettype($searchChoice) . ',valueArray()=' . count($valueArray) . ',idx=' . $idx . ',isMatching=' . intval($isMatching) . ' - CHOICE-MATCH'); + } else { + // Choice-match is NULL? + $isMatching = (($isMatching === TRUE) || (is_null($searchDefault))); + + // Debug message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SEARCH-CRITERIA[' . __LINE__ . ']: getCriteriaChoiceElement(' . $key . ')[]=' . gettype($searchChoice) . ',value=' . $value . ',isMatching=' . intval($isMatching) . ' - NULL-MATCH'); + } + + // Debug message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SEARCH-CRITERIA[' . __LINE__ . ']: getCriteriaChoiceElement(' . $key . ')[]=' . gettype($searchChoice) . ',isMatching=' . intval($isMatching)); // Get 'exclude' search value - $search = $this->getCriteriaExcludeElemnent($key); + $searchExclude = $this->getCriteriaExcludeElemnent($key); + + // Debug message + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SEARCH-CRITERIA[' . __LINE__ . ']: getCriteriaExcludeElement(' . $key . ')[' . gettype($searchExclude) . ']=' . $searchExclude); // 'exclude' check - $isMatching = (($isMatching === TRUE) && ((is_null($search)) || ($search != $value))); + $isMatching = (((is_null($searchChoice)) || ($isMatching === TRUE)) && ((is_null($searchExclude)) || ($searchExclude != $value))); // Return result + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('SEARCH-CRITERIA[' . __LINE__ . ']: key=' . $key . ',value=' . $value . ',isMatching=' . intval($isMatching) . ' - EXIT!'); return $isMatching; } }