<?php
$templateData = [
0 => 'h',
1 => 1,
2 => 2,
3 => 3,
4 => 'c-1-3',
5 => 3,
6 => 5,
7 => 'c-2-3',
8 => 3,
9 => 'f',
10 => 2
];
$tmpKey = '';
$tmpArray = [];
class Test
{
/**
* @var []
*/
private $data = [];
/**
* @var []
*/
private $columns = [];
/**
* @var array
*/
private $numOfColumns = 0;
/**
* @var []
*/
private $header = [];
/**
* @var []
*/
private $footer = [];
/**
* @var string
*/
private $current = [
'key' => '',
'matches' => ''
];
/**
* @var []
*/
private $rules = [
'header' => [
'expression' => 'h',
'handler' => 'headerHandler',
'matches' => false
],
'footer' => [
'expression' => 'f',
'handler' => 'footerHandler',
'matches' => false
],
'columns' => [
'expression' => 'c-\d+-\d+',
'handler' => 'columnHandler',
'matches' => "columnMatches"
]
];
/**
* @param $data
*/
public function __construct($data)
{
$this->data = $data;
$this->process();
}
/**
* @throws Exception
*/
private function process()
{
foreach($this->data as $data) {
if (!$this->setRule($data)) {
throw new \RuntimeException("Rule Not found.");
}
} else {
$this->handleRule($data);
}
}
}
/**
* @param $data
*/
private function headerHandler($data)
{
}
/**
* @param $data
*/
private function footerHandler($data)
{
$this->footer[] = $data;
}
/**
* @param $data
*/
private function columnHandler($data)
{
if ($this->columns[($columns[1] - 1)][0] == 0){
$this->columns[($columns[1] - 1)][0] = $data;
} else {
array_push($this->columns[($columns[1] - 1)], $data); }
}
/**
* @param $data
*/
private function columnMatches($data)
{
if ($this->numOfColumns == 0) {
$this->numOfColumns = end($columns); $this->columns = array_fill(0, $this->numOfColumns, [0]); }
}
/**
* @param $data
* @return bool
*/
private function setRule($data)
{
foreach($this->rules as $key => $rules) {
if (preg_match("/^{$rules['expression']}$/", $data, $matches)) { if ($rules['matches']) {
$this->{$rules['matches']}($data);
}
return true;
}
}
return false;
}
/**
* @return mixed
*/
public function getHeader()
{
}
/**
* @return mixed
*/
public function getColumns()
{
return $this->columns;
}
/**
* @return mixed
*/
public function getFooter()
{
return $this->footer;
}
/**
* @return array
*/
public function getResult()
{
return [
1 => $this->columns,
2 => $this->footer
];
}
/**
* @param $data
*/
private function handleRule($data)
{
$this->{$this->rules[$this->current['key']]['handler']}($data); }
}
$test = new Test($templateData);
echo '<h1>Header</h1>';
echo '<h1>Footer</h1>';
echo '<h1>Columns</h1>';
echo '<h1>Result</h1>';
PD9waHAKJHRlbXBsYXRlRGF0YSA9IFsKICAgIDAgPT4gJ2gnLAogICAgMSA9PiAxLAogICAgMiA9PiAyLAogICAgMyA9PiAzLAogICAgNCA9PiAnYy0xLTMnLAogICAgNSA9PiAzLAogICAgNiA9PiA1LAogICAgNyA9PiAnYy0yLTMnLAogICAgOCA9PiAzLAogICAgOSA9PiAnZicsCiAgICAxMCA9PiAyCl07CgokdG1wS2V5ID0gJyc7CiR0bXBBcnJheSA9IFtdOwoKY2xhc3MgVGVzdAp7CiAgICAvKioKICAgICAqIEB2YXIgW10KICAgICAqLwogICAgcHJpdmF0ZSAkZGF0YSA9IFtdOwoKICAgIC8qKgogICAgICogQHZhciBbXQogICAgICovCiAgICBwcml2YXRlICRjb2x1bW5zID0gW107CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHByaXZhdGUgJG51bU9mQ29sdW1ucyA9IDA7CgogICAgLyoqCiAgICAgKiBAdmFyIFtdCiAgICAgKi8KICAgIHByaXZhdGUgJGhlYWRlciA9IFtdOwoKICAgIC8qKgogICAgICogQHZhciBbXQogICAgICovCiAgICBwcml2YXRlICRmb290ZXIgPSBbXTsKCiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgJGN1cnJlbnQgPSBbCiAgICAgICAgJ2tleScgPT4gJycsCiAgICAgICAgJ21hdGNoZXMnID0+ICcnCiAgICBdOwoKICAgIC8qKgogICAgICogQHZhciBbXQogICAgICovCiAgICBwcml2YXRlICRydWxlcyA9IFsKICAgICAgICAnaGVhZGVyJyA9PiBbCiAgICAgICAgICAgICdleHByZXNzaW9uJyA9PiAnaCcsCiAgICAgICAgICAgICdoYW5kbGVyJyA9PiAnaGVhZGVySGFuZGxlcicsCiAgICAgICAgICAgICdtYXRjaGVzJyA9PiBmYWxzZQogICAgICAgIF0sCiAgICAgICAgJ2Zvb3RlcicgPT4gWwogICAgICAgICAgICAnZXhwcmVzc2lvbicgPT4gJ2YnLAogICAgICAgICAgICAnaGFuZGxlcicgPT4gJ2Zvb3RlckhhbmRsZXInLAogICAgICAgICAgICAnbWF0Y2hlcycgPT4gZmFsc2UKICAgICAgICBdLAogICAgICAgICdjb2x1bW5zJyA9PiBbCiAgICAgICAgICAgICdleHByZXNzaW9uJyA9PiAnYy1cZCstXGQrJywKICAgICAgICAgICAgJ2hhbmRsZXInID0+ICdjb2x1bW5IYW5kbGVyJywKICAgICAgICAgICAgJ21hdGNoZXMnID0+ICJjb2x1bW5NYXRjaGVzIgogICAgICAgIF0KICAgIF07CgogICAgLyoqCiAgICAgKiBAcGFyYW0gJGRhdGEKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRkYXRhKQogICAgewogICAgICAgICR0aGlzLT5kYXRhID0gJGRhdGE7CiAgICAgICAgJHRoaXMtPnByb2Nlc3MoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gcHJvY2VzcygpCiAgICB7CiAgICAgICAgZm9yZWFjaCgkdGhpcy0+ZGF0YSBhcyAkZGF0YSkgewoKICAgICAgICAgICAgaWYgKCFpc19pbnQoJGRhdGEpKSB7CiAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5zZXRSdWxlKCRkYXRhKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiUnVsZSBOb3QgZm91bmQuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+aGFuZGxlUnVsZSgkZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gJGRhdGEKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBoZWFkZXJIYW5kbGVyKCRkYXRhKQogICAgewogICAgICAgICR0aGlzLT5oZWFkZXJbXSA9ICRkYXRhOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtICRkYXRhCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZm9vdGVySGFuZGxlcigkZGF0YSkKICAgIHsKICAgICAgICAkdGhpcy0+Zm9vdGVyW10gPSAkZGF0YTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSAkZGF0YQogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGNvbHVtbkhhbmRsZXIoJGRhdGEpCiAgICB7CiAgICAgICAgJGNvbHVtbnMgPSBleHBsb2RlKCctJywgJHRoaXMtPmN1cnJlbnRbJ21hdGNoZXMnXSk7CiAgICAgICAgaWYgKCR0aGlzLT5jb2x1bW5zWygkY29sdW1uc1sxXSAtIDEpXVswXSA9PSAwKXsKICAgICAgICAgICAgJHRoaXMtPmNvbHVtbnNbKCRjb2x1bW5zWzFdIC0gMSldWzBdID0gJGRhdGE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXJyYXlfcHVzaCgkdGhpcy0+Y29sdW1uc1soJGNvbHVtbnNbMV0gLSAxKV0sICRkYXRhKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gJGRhdGEKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBjb2x1bW5NYXRjaGVzKCRkYXRhKQogICAgewogICAgICAgICRjb2x1bW5zID0gZXhwbG9kZSgnLScsICRkYXRhKTsKCiAgICAgICAgaWYgKCR0aGlzLT5udW1PZkNvbHVtbnMgPT0gMCkgewogICAgICAgICAgICAkdGhpcy0+bnVtT2ZDb2x1bW5zID0gZW5kKCRjb2x1bW5zKTsKICAgICAgICAgICAgJHRoaXMtPmNvbHVtbnMgPSBhcnJheV9maWxsKDAsICR0aGlzLT5udW1PZkNvbHVtbnMsIFswXSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtICRkYXRhCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBzZXRSdWxlKCRkYXRhKQogICAgewogICAgICAgIGZvcmVhY2goJHRoaXMtPnJ1bGVzIGFzICRrZXkgPT4gJHJ1bGVzKSB7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCIvXnskcnVsZXNbJ2V4cHJlc3Npb24nXX0kLyIsICRkYXRhLCAkbWF0Y2hlcykpIHsKICAgICAgICAgICAgICAgIGlmICgkcnVsZXNbJ21hdGNoZXMnXSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT57JHJ1bGVzWydtYXRjaGVzJ119KCRkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aGlzLT5jdXJyZW50WydrZXknXSA9ICRrZXk7CiAgICAgICAgICAgICAgICAkdGhpcy0+Y3VycmVudFsnbWF0Y2hlcyddID0gJGRhdGE7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SGVhZGVyKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmhlYWRlcjsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbHVtbnMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y29sdW1uczsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEZvb3RlcigpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5mb290ZXI7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRSZXN1bHQoKQogICAgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIDAgPT4gWyR0aGlzLT5oZWFkZXJdLAogICAgICAgICAgICAxID0+ICR0aGlzLT5jb2x1bW5zLAogICAgICAgICAgICAyID0+ICR0aGlzLT5mb290ZXIKICAgICAgICBdOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtICRkYXRhCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gaGFuZGxlUnVsZSgkZGF0YSkKICAgIHsKICAgICAgICAkdGhpcy0+eyR0aGlzLT5ydWxlc1skdGhpcy0+Y3VycmVudFsna2V5J11dWydoYW5kbGVyJ119KCRkYXRhKTsKICAgIH0KCn0KCiR0ZXN0ID0gbmV3IFRlc3QoJHRlbXBsYXRlRGF0YSk7CmVjaG8gJzxoMT5IZWFkZXI8L2gxPic7CnZhcl9kdW1wKCR0ZXN0LT5nZXRIZWFkZXIoKSk7CmVjaG8gJzxoMT5Gb290ZXI8L2gxPic7CnZhcl9kdW1wKCR0ZXN0LT5nZXRGb290ZXIoKSk7CmVjaG8gJzxoMT5Db2x1bW5zPC9oMT4nOwp2YXJfZHVtcCgkdGVzdC0+Z2V0Q29sdW1ucygpKTsKZWNobyAnPGgxPlJlc3VsdDwvaDE+JzsKdmFyX2R1bXAoJHRlc3QtPmdldFJlc3VsdCgpKTtleGl0Ow==