Excel导入数据,数据带有层级,最终生成树形结构数据

Excel数据表示例:

科室1

科室1.1

科室1.2

科室1.2.1

科室1.2.2

科室1.2.3

科室1.3

科室2

科室2.1

科室2.2

科室2.2.1

科室2.2.1.1

科室2.2.1.1

 

方法主要思想:类似于指针的一个思想

导入数据:引用扩展或者包,根据实际情况来决定

PHP 两种方式:

  1.  先上传文件,再打开文件     

set_time_limit(0);

$file = fopen($_FILES['file']['tmp_name'], 'r');

$data = eval('return ' . iconv('gbk', 'utf-8', var_export($data, true)) . ';');//编码转换                

$data = array_filter($data); //数据处理,处理成合格的格式

  1.  扩展(PHPExcel)解析获取内容

//文件数据

$fileObjArr=””;  

//文件存放目录

$saveFolderName = "";

 //拼接路径(相对路径)

$fileName = $importTime.$fileSufName;

//拼接路径(绝对路径)

$urlpre = $_SERVER['DOCUMENT_ROOT']."/upload/".$saveFolderName."/";

//上传文件

!is_dir($urlpre)&&mkdir($urlpre,0777,true);

$saveurl = $urlpre.$fileName;

move_uploaded_file($fileObjArr['myfile']['tmp_name'], $saveurl);

set_time_limit(0);

$excelpath = $saveurl;

//引入扩展

$this->load->library("PHPExcel/PHPExcel");

$this->load->library("PHPExcel/PHPExcel/IOFactory");

$objReader = IOFactory::createReader('Excel2007');

//需要使用xlsx格式的表格

$objPHPExcel = $objReader->load($excelpath);

//读取表格数据后,删除服务器表格文件

unlink($excelpath);

// 只读取数据,忽略所有空白行

$objReader->setReadDataOnly(true);

$sheet = $objPHPExcel->getSheet(0);

//取得总行数

$highestRow = $sheet->getHighestRow();

$highestColumn = $sheet->getHighestColumn();

//取得总列数

$highestColumn = PHPExcel_Cell::columnIndexFromString($highestColumn);

//初始化容器

$cellValue ='';

//从第二行开始读取数据

for ($j=1; $j<=$highestRow; $j++) {    

//从A列开始读取数据

  for ($k=0; $k<$highestColumn; $k++) {

         $columnIndex = PHPExcel_Cell::stringFromColumnIndex($k);

         $cellValue .= $sheet->getCell($columnIndex.$j)->getValue().',';//读取单元格

        }

 }

//转换成数组

$celldata = explode(',',$cellValue);

//切成数据块

$datas = array_chunk($celldata,$highestColumn);

经过上述方法的处理得到的数据,实际上是一个二维数组

一维Key值

二维Key值:0

二维Key值:1

二维Key值:2

二维Key值:3

0

科室1

/

/

/

1

/

科室1.1

/

/

2

/

科室1.2

/

/

3

/

/

科室1.2.1

/

4

/

/

科室1.2.2

/

5

/

/

科室1.2.3

/

6

/

科室1.3

/

/

7

科室2

/

/

/

8

/

科室2.1

/

/

9

/

科室2.2

/

/

10

/

/

科室2.2.1

/

11

/

/

/

科室2.2.1.1

12

/

/

/

科室2.2.1.2

表1.1

数组展示:

array(4) {

  [0]=>string(7) "科室1"

  [1]=>string(0) ""

  [2]=>string(0) ""

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(9) "科室1.1"

  [2]=>string(0) ""

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(9) "科室1.2"

  [2]=>string(0) ""

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(0) ""

  [2]=>string(11) "科室1.2.1"

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(0) ""

  [2]=>string(11) "科室1.2.2"

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(0) ""

  [2]=>string(11) "科室1.2.3"

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(9) "科室1.3"

  [2]=>string(0) ""

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(7) "科室2"

  [1]=>string(0) ""

  [2]=>string(0) ""

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=> string(9) "科室2.1"

  [2]=>string(0) ""

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(9) "科室2.2"

  [2]=>string(0) ""

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(0) ""

  [2]=>string(11) "科室2.2.1"

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(0) ""

  [2]=>string(0) ""

  [3]=>string(13) "科室2.2.1.1"

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(0) ""

  [2]=>string(0) ""

  [3]=>string(13) "科室2.2.1.2"

}

数据重组:

Key值

name

level

parent_key(参考1.1表一维Key值)

0

科室1

1

0

1

科室1.1

2

0

2

科室1.2

2

0

3

科室1.2.1

3

2

4

科室1.2.2

3

2

5

科室1.2.3

3

2

6

科室1.3

2

0

7

科室2

1

0

8

科室2.1

2

7

9

科室2.2

2

7

10

科室2.2.1

3

9

11

科室2.2.1.1

4

10

12

科室2.2.1.2

4

10

表1.2

数据展示:

array(13) {

  [0]=>

  array(3) {

    ["name"]=>string(7) "科室1"

    ["parent_key"]=>int(0)

    ["level"]=>int(1)

  }

  [1]=>

  array(3) {

    ["name"]=>string(9) "科室1.1"

    ["parent_key"]=>int(0)

    ["level"]=>int(2)

  }

  [2]=>

  array(3) {

    ["name"]=>string(9) "科室1.2"

    ["parent_key"]=>int(0)

    ["level"]=>int(2)

  }

  [3]=>

  array(3) {

    ["name"]=>string(11) "科室1.2.1"

    ["parent_key"]=>int(2)

    ["level"]=>int(3)

  }

  [4]=>

  array(3) {

    ["name"]=>string(11) "科室1.2.2"

    ["parent_key"]=>int(2)

    ["level"]=>int(3)

  }

  [5]=>

  array(3) {

    ["name"]=>string(11) "科室1.2.3"

    ["parent_key"]=>int(2)

    ["level"]=>int(3)

  }

  [6]=>

  array(3) {

    ["name"]=>string(9) "科室1.3"

    ["parent_key"]=>int(0)

    ["level"]=>int(2)

  }

  [7]=>

  array(3) {

    ["name"]=>string(7) "科室2"

    ["parent_key"]=>int(0)

    ["level"]=>int(1)

  }

  [8]=>

  array(3) {

    ["name"]=>string(9) "科室2.1"

    ["parent_key"]=>int(7)

    ["level"]=>int(2)

  }

  [9]=>

  array(3) {

    ["name"]=>string(9) "科室2.2"

    ["parent_key"]=>int(7)

    ["level"]=>int(2)

  }

  [10]=>

  array(3) {

    ["name"]=>string(11) "科室2.2.1"

    ["parent_key"]=> int(9)

    ["level"]=>int(3)

  }

  [11]=>

  array(3) {

    ["name"]=>string(13) "科室2.2.1.1"

    ["parent_key"]=>int(10)

    ["level"]=>int(4)

  }

  [12]=>

  array(3) {

    ["name"]=>string(13) "科室2.2.1.2"

    ["parent_key"]=> int(10)

    ["level"]=>int(4)

  }

}

如表1.2现在所有的数据已经整理成为具有层级关系的数组(二维数组包含树结构),数据入库,获取插入数据的主键id,方便数据库表里面建立树形关系(id,fid:  子级数据fid = 父级数据的id)

//初始化容器

$array = [];

//1.循环插入数据(边插入边取值:数据已经是  树根->末尾树叶   结构,所以可以采用这种方法)

//2.循环插入数据(可以先插入一级,再插入二级数据,递归调用,直到最后节点,具体情况采用不同的方法)

foreach ($arr as $key=>$v){

    $_data = [

     'fid'=>$v['level']==1 ? 0 : ($array[$v['parent_key']]['id']?$array[$v['parent_key']]['id']:0),

        'name'=>$v['name'],

        'level'=>$v['level']

         ];

    $this->db->insert('表名',$_data);

    $v['id'] = $this->db->insert_id();

    $array[] = $v;

}

如此操作,数据入表后就是整理好的树形结构

你可能感兴趣的:(excel,php,算法,b树)