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 两种方式:
- 先上传文件,再打开文件
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); //数据处理,处理成合格的格式
- 扩展(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;
}
如此操作,数据入表后就是整理好的树形结构