Parser.php
3.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
<?php
/**
 * Created by PhpStorm.
 * User: Cibermag
 * Date: 04.09.2015
 * Time: 18:25
 */
namespace common\components\parsers;
//@todo - заменить read на parse
//@todo - xml - убрать из названий функций xml и array - это и так понятно
use common\components\CustomVarDamp;
abstract class Parser
{
    public $converter_conf  = [];
    protected $converter = NULL;
    /** @var file-resource читаемого файла */
    public $file;
    /** @var string путь читаемого файла */
    public $file_path;
    /**
     * @var array - результирующий массив с отпарсенными значениями
     */
    protected $result = [];
    /** @var array - массив с заголовком,
     * */
    public $keys = NULL;
    /** @var bool
    имеет ли файл заголовок который будет установлен ключами возвращемого массива*/
    public $has_header_row = false;
    /*
     *если есть ключи, то колонки с пустыми значениями будут пропускаться (из ряда такие значения будут удаляться),
     * например если в файле вторая колонка пустая то она будет удалена
     * если есть $has_header_row - то первая значимая строка становится ключами, но пустые колонки не удаляются из ряда
     * например если в файле вторая колонка пустая то ей будет назначен соответсвующий ключ (второй) из первой строки
     * все описаное выше реализуется в дочернем семействе классов TableParser в методе filterRow()
     * для xml происходит просто сопоставление переданных ключей с прочитанными
    */
    public function setup()
    {
        $this->setupConverter();
    }
    protected function setupConverter()
    {
        if ( $this->has_header_row || $this->keys !== NULL ) {
            // если у файла есть заголовок, то в результате имеем ассоциативный массив
            $this->converter_conf['hasKey'] = 1;
        }
        if ( $this->converter_conf ) {
            $converter = ObjectCreator::build( $this->converter_conf );
            if ( $converter instanceof ConverterInterface ) {
                $this->converter = $converter;
            }
        }
    }
    public abstract function read();
    /**
     * @param $arr
     * @return mixed
     * преобразовует значения прочитанного массива в нужные типы, согласно конфигурации конвертера
     */
    protected function convert( $arr )
    {
        if ($this->converter !== NULL) {
            $arr = $this->converter->convertByConfiguration( $arr, $this->converter_conf );
        }
        return $arr;
    }
    protected function cleanUp(  )
    {
        unset( $this->file );
        unset( $this->converter );
        unset( $this->converter_conf );
    }
}