今天写了一个解析国家行政区域的类,但是看到别人的代码,自己觉得的特别好,评论也很好,但是我看了半天没有看懂,现在写出来分析下,先贴上代码
我把分析放到注释中去
1 <?php 2 3 // config 4 $host = ''; 5 $dbname = ''; 6 $charset = ''; 7 $username = ''; 8 $password = ''; 9 10 set_time_limit(0); 11 12 $dsn = "mysql:host={$host};dbname={$dbname};charset={$charset}"; 13 14 $options = array( 15 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 16 ); 17 18 $dbh = new PDO($dsn, $username, $password, $options); 19 20 $sth = $dbh->prepare(' 21 INSERT INTO region (id, parent_id, name) 22 VALUES (:id, :parent_id, :name) 23 '); 24 //前面是数据库结构,这里开始吧 25 $parent = array(); //一个使用$level索引的父ID数组 26 27 $handle = fopen('data.txt', 'r'); //文件打开句柄 28 29 while (!feof($handle)) { //判断是否是文件末尾 30 $row = trim(fgets($handle)); //读取一行并去除两端空格 31 32 if (!preg_match('/^(\d+)(\s+)(.+)$/', $row, $matches)) { 33 continue; //正则匹配到一个数组 34 } 35 36 list($row, $id, $delimiter, $name) = $matches; //拆散数组 37 38 if (!isset($separator)) { //亮点出现了,这里是一个判断缩进长度的方法,定义一个由几个空格组成的缩进单位 39 $separator = $delimiter; 40 } 41 42 $level = substr_count($delimiter, $separator); //计算缩进单位获取区域级别 43 44 $parent_id = $level > 1 ? $parent[$level - 1] : 0; //如果当前不是根的级别,就获取到当前的父ID,这里的上下文比较难理解 45 46 $parent[$level] = $id; //根据级别生成一个父ID 47 48 $sth->bindValue(':id', $id, PDO::PARAM_INT); 49 $sth->bindValue(':parent_id', $parent_id, PDO::PARAM_INT); 50 $sth->bindValue(':name', $name); 51 52 $sth->execute(); 53 } 54 55 fclose($handle); 56 57 ?>