diff --git a/src/enums/DatatypeEnum.php b/src/enums/DatatypeEnum.php new file mode 100644 index 0000000..77ab684 --- /dev/null +++ b/src/enums/DatatypeEnum.php @@ -0,0 +1,117 @@ + null, + self::TYPE_INT => 'isValidInteger', + self::TYPE_BOOL => 'isValidBoolean', + self::TYPE_FLOAT => 'isValidFloat', + self::TYPE_DATE => 'isValidDate' + ); + + /** + * Checks data type for given string. + * + * @param string $value + * + * @return bool|string + */ + public static function getValidTypeFromSample($value){ + $value = trim((string) $value); + + if (empty($value)){ + return false; + } + + foreach (self::$validators as $type => $validator){ + if ($validator === null){ + continue; + } + + if (method_exists(__CLASS__, $validator)){ + if (get_class()::$validator($value)) { + return $type; + } + } + + return self::__DEFAULT; + } + } + + /** + * Check if string is float value. + * + * @param string $value + * + * @return bool + */ + private static function isValidFloat($value) { + return (bool) preg_match(self::REGEX_FLOAT, $value); + } + + /** + * Check if string is integer value. + * + * @param string $value + * + * @return bool + */ + private static function isValidInteger($value) { + return (bool) preg_match(self::REGEX_INT, $value); + } + + /** + * Check if string is boolean. + * + * @param string $value + * + * @return bool + */ + private static function isValidBoolean($value) { + return (bool) preg_match(self::REGEX_BOOL, $value); + } + + /** + * Check if string is date. + * + * @param string $value + * + * @return bool + */ + private static function isValidDate($value) { + return (bool) strtotime($value); + } +} diff --git a/src/extensions/DatatypeTrait.php b/src/extensions/DatatypeTrait.php index 9a7e610..6ffd9e2 100644 --- a/src/extensions/DatatypeTrait.php +++ b/src/extensions/DatatypeTrait.php @@ -12,42 +12,6 @@ trait DatatypeTrait { */ public $data_types = []; - /** - * Check data type - * Check for possible data types for one field value string. - * - * @access private - * - * @param string $value cell value - * - * @return string - */ - private function getDatatypeFromString($value) { - $value = trim((string) $value); - - if (empty($value)) { - return 'unknown'; - } - - if (preg_match('/^(?i:true|false)$/', $value)) { - return 'boolean'; - } - - if (preg_match('/^[-+]?[0-9]\d*$/', $value)) { - return 'integer'; - } - - if (preg_match('/(^[+-]?$)|(^[+-]?[0-9]+([,.][0-9])?[0-9]*(e[+-]?[0-9]+)?$)/', $value)) { - return 'float'; - } - - if ((bool) strtotime($value)) { - return 'date'; - } - - return 'string'; - } - /** * Check data type for one column. * Check for most commonly data type for one column. @@ -59,9 +23,15 @@ trait DatatypeTrait { * @return string|false */ private function getMostFrequentDataypeForColumn($datatypes) { - unset($datatypes['unknown']); + array_filter($datatypes); - $typesFreq = array_count_values($datatypes); + // workaround because array_count_values($datatypes) does not work anymore :-( + foreach ($datatypes as $type) { + $ids = array_keys($datatypes, $type); + $typesFreq[$type] = count($ids); + + $datatypes = array_diff_key($datatypes, array_flip($ids)); + } arsort($typesFreq); reset($typesFreq); @@ -90,13 +60,14 @@ trait DatatypeTrait { $result = []; foreach ($this->titles as $cName) { $column = array_column($this->data, $cName); - $cDatatypes = array_map([$this, 'getDatatypeFromString'], $column); + + $cDatatypes = array_map('ParseCsv\enums\DatatypeEnum::getValidTypeFromSample', $column); $result[$cName] = $this->getMostFrequentDataypeForColumn($cDatatypes); } $this->data_types = $result; - return !empty($this->data_types) ? $this->data_types : false; + return !empty($this->data_types) ? $this->data_types : []; } }