CSVConverter.php 3.87 KB
<?php
/**
* Created by PhpStorm.
 * User: Cibermag
* Date: 31.08.2015
* Time: 12:50
*/

namespace yii\multiparser;

// класс который содержит преобразователи значений (фильтры) используемые при парсинге
class CSVConverter
{

    protected static $method_prefix = 'convertTo';

    public static $configuration = [];

    protected static function convertToFloat($value)
    {

        if ($value == '') {
            $value = 0;
        }
        $value = trim(str_replace(",", ".", $value));
        $value = preg_replace("/[^0-9.]+/", "", strtoupper($value));

        if ($value == '') {
            return '';
        }
        $value = round( (float)$value, 2 );

        return $value;
    }

    protected static function convertToInteger($value)
    {
        if ($value == '') {
            $value = 0;
        }
        $value = trim(str_replace(",", ".", $value));
        $value = preg_replace("/[^0-9.]+/", "", strtoupper($value));
        if ($value == '') {
            return '';
        }
        $value = round((int)$value, 2);

        return $value;
    }

    protected static function convertToString($value)
    {
        $res = '';
        if (is_array($value)) {

            $res = Encoder::encodeArray($value);

        }elseif ( is_string($value) ) {

            $res = Encoder::encodeString($value);

        }

        return $res;
    }


    /**
     * @param $name - имя метода конвертации
     * @param $value - значение на конвертацию
     * @return mixed
     */
    public static function __callStatic( $name, $value )
    {
        $method_name =  self::$method_prefix . $name;
        if ( is_callable( $method_name ) ) {

            self::$method_name( $value );

        } else{
            // если такого метода конвертации не предусмотрено, то возвращаем не конвертируя
            return $value;

        }
    }


    /**
     * @param $arr - массив
     * @return mixed
     * конвертирует массив по полученным настройкам, вызывая последовательно функции конвертации (указанные в конфигурации)
     */
    public static function convertByConfiguration( $arr  )
    {
        $result = $arr;

        $hasKey = isset( self::$configuration['hasKey'] );

        foreach ( self::$configuration as $key => $value ) {

            if ( $hasKey ){
                //  у нас ассоциативный массив, и мы можем конвертировать каждое значение в отдельности
                if ( is_array( $value ) ) {
                    foreach ($value as $sub_value) {
                        if (isset($arr[$sub_value])) {
                            // конвертируем только те ячейки которые сопоставлены в прочитанном массиве с колонками в конфигурационном файле
                            $result[$arr[$sub_value]] = self::$key( $arr[$sub_value] );
                        }

                    }
                } else {

                    if (isset($arr[$value])) {
                        // конвертируем только те ячейки которые сопоставлены в прочитанном массиве с колонками в конфигурационном файле
                        $result[$arr[$value]] = self::$key( $arr[$value] );
                    }

                }

            } else {
                // нет заголовка - мы можем конвертировать только с року в целом
                $result = self::$key( $arr );
            }

        }

        return $result;
    }


}