Initial commit: apps.supersam24.ru
This commit is contained in:
commit
72afea602d
2747 files changed
+682150
No files matched your search
+1399
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace ParseCsv\enums;
|
||||
|
||||
abstract class AbstractEnum {
|
||||
|
||||
/**
|
||||
* Creates a new value of some type
|
||||
*
|
||||
* @param mixed $value
|
||||
*
|
||||
* @throws \UnexpectedValueException if incompatible type is given.
|
||||
*/
|
||||
public function __construct($value) {
|
||||
if (!$this->isValid($value)) {
|
||||
throw new \UnexpectedValueException("Value '$value' is not part of the enum " . get_called_class());
|
||||
}
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
public static function getConstants() {
|
||||
$class = get_called_class();
|
||||
$reflection = new \ReflectionClass($class);
|
||||
|
||||
return $reflection->getConstants();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if enum value is valid
|
||||
*
|
||||
* @param $value
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValid($value) {
|
||||
return in_array($value, static::getConstants(), true);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
namespace ParseCsv\enums;
|
||||
|
||||
/**
|
||||
* Class DatatypeEnum
|
||||
*
|
||||
* @package ParseCsv\enums
|
||||
*
|
||||
* todo: needs a basic parent enum class for error handling.
|
||||
*/
|
||||
class DatatypeEnum extends AbstractEnum {
|
||||
|
||||
const __DEFAULT = self::TYPE_STRING;
|
||||
|
||||
const TYPE_STRING = 'string';
|
||||
|
||||
const TYPE_FLOAT = 'float';
|
||||
|
||||
const TYPE_INT = 'integer';
|
||||
|
||||
const TYPE_BOOL = 'boolean';
|
||||
|
||||
const TYPE_DATE = 'date';
|
||||
|
||||
const REGEX_FLOAT = '/(^[+-]?$)|(^[+-]?[0-9]+([,.][0-9])?[0-9]*(e[+-]?[0-9]+)?$)/';
|
||||
|
||||
const REGEX_INT = '/^[-+]?[0-9]\d*$/';
|
||||
|
||||
const REGEX_BOOL = '/^(?i:true|false)$/';
|
||||
|
||||
/**
|
||||
* Define validator functions here.
|
||||
*
|
||||
* @var array
|
||||
*
|
||||
* @uses isValidFloat
|
||||
* @uses isValidInteger
|
||||
* @uses isValidBoolean
|
||||
* @uses isValidDate
|
||||
*/
|
||||
private static $validators = array(
|
||||
self::TYPE_STRING => 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) && self::$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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace ParseCsv\enums;
|
||||
|
||||
|
||||
/**
|
||||
* Class FileProcessingEnum
|
||||
*
|
||||
* @package ParseCsv\enums
|
||||
*
|
||||
* todo extends a basic enum class after merging #121
|
||||
*/
|
||||
class FileProcessingModeEnum {
|
||||
|
||||
const __default = self::MODE_FILE_OVERWRITE;
|
||||
|
||||
const MODE_FILE_APPEND = true;
|
||||
|
||||
const MODE_FILE_OVERWRITE = false;
|
||||
|
||||
public static function getAppendMode($mode) {
|
||||
if ($mode == self::MODE_FILE_APPEND) {
|
||||
return 'ab';
|
||||
}
|
||||
|
||||
return 'wb';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace ParseCsv\enums;
|
||||
|
||||
|
||||
class SortEnum extends AbstractEnum {
|
||||
|
||||
const __DEFAULT = self::SORT_TYPE_REGULAR;
|
||||
|
||||
const SORT_TYPE_REGULAR = 'regular';
|
||||
|
||||
const SORT_TYPE_NUMERIC = 'numeric';
|
||||
|
||||
const SORT_TYPE_STRING = 'string';
|
||||
|
||||
private static $sorting = array(
|
||||
self::SORT_TYPE_REGULAR => SORT_REGULAR,
|
||||
self::SORT_TYPE_STRING => SORT_STRING,
|
||||
self::SORT_TYPE_NUMERIC => SORT_NUMERIC,
|
||||
);
|
||||
|
||||
public static function getSorting($type) {
|
||||
if (array_key_exists($type, self::$sorting)) {
|
||||
return self::$sorting[$type];
|
||||
}
|
||||
|
||||
return self::$sorting[self::__DEFAULT];
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
<?php
|
||||
|
||||
namespace ParseCsv\extensions;
|
||||
|
||||
use ParseCsv\enums\DatatypeEnum;
|
||||
|
||||
trait DatatypeTrait {
|
||||
|
||||
/**
|
||||
* Data Types
|
||||
* Data types of CSV data-columns, keyed by the column name. Possible values
|
||||
* are string, float, integer, boolean, date. See DatatypeEnum.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $data_types = [];
|
||||
|
||||
/**
|
||||
* Check data type for one column.
|
||||
* Check for most commonly data type for one column.
|
||||
*
|
||||
* @param array $datatypes
|
||||
*
|
||||
* @return string|false
|
||||
*/
|
||||
private function getMostFrequentDatatypeForColumn($datatypes) {
|
||||
// remove 'false' from array (can happen if CSV cell is empty)
|
||||
$typesFiltered = array_filter($datatypes);
|
||||
|
||||
if (empty($typesFiltered)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$typesFreq = array_count_values($typesFiltered);
|
||||
arsort($typesFreq);
|
||||
reset($typesFreq);
|
||||
|
||||
return key($typesFreq);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Check data type foreach Column
|
||||
* Check data type for each column and returns the most commonly.
|
||||
*
|
||||
* Requires PHP >= 5.5
|
||||
*
|
||||
* @uses DatatypeEnum::getValidTypeFromSample
|
||||
*
|
||||
* @return array|bool
|
||||
*/
|
||||
public function getDatatypes() {
|
||||
if (empty($this->data)) {
|
||||
$this->data = $this->_parse_string();
|
||||
}
|
||||
if (!is_array($this->data)) {
|
||||
throw new \UnexpectedValueException('No data set yet.');
|
||||
}
|
||||
|
||||
$result = [];
|
||||
foreach ($this->titles as $cName) {
|
||||
$column = array_column($this->data, $cName);
|
||||
$cDatatypes = array_map(DatatypeEnum::class . '::getValidTypeFromSample', $column);
|
||||
|
||||
$result[$cName] = $this->getMostFrequentDatatypeForColumn($cDatatypes);
|
||||
}
|
||||
|
||||
$this->data_types = $result;
|
||||
|
||||
return !empty($this->data_types) ? $this->data_types : [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Check data type of titles / first row for auto detecting if this could be
|
||||
* a heading line.
|
||||
*
|
||||
* Requires PHP >= 5.5
|
||||
*
|
||||
* @uses DatatypeEnum::getValidTypeFromSample
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function autoDetectFileHasHeading() {
|
||||
if (empty($this->data)) {
|
||||
throw new \UnexpectedValueException('No data set yet.');
|
||||
}
|
||||
|
||||
if ($this->heading) {
|
||||
$firstRow = $this->titles;
|
||||
} else {
|
||||
$firstRow = $this->data[0];
|
||||
}
|
||||
|
||||
$firstRow = array_filter($firstRow);
|
||||
if (empty($firstRow)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$firstRowDatatype = array_map(DatatypeEnum::class . '::getValidTypeFromSample', $firstRow);
|
||||
|
||||
return $this->getMostFrequentDatatypeForColumn($firstRowDatatype) === DatatypeEnum::TYPE_STRING;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user