SQL转化为markdown语法
```
public function sql2md() {
/* 从文件中取出SQL语句字符串 */
$string = file_get_contents(SITE_PATH.'weibo.sql');
/* STEP1 将CREATE TABLE正则匹配出来放入数组,匹配完成后每张表的数据都储存到数组的一个元素 */
$result = preg_match_all('/CREATE\s+TABLE.+?`(?P<name>\w+)`.+?\((?P<fields_str>.+?)PRIMARY\s+KEY\s+\(`(?P<primary_key>\w+)`\)(?P<keys>.+?)\)\sENGINE=(?P<engine>\w+).+?CHARSET=(?P<charset>[\w\d]+).+?COMMENT=\'(?P<comment>.+?)\'.+?AUTO_INCREMENT=\d+\s+;/is', $string, $matches, PREG_SET_ORDER);
$tables = array();
/* STEP2 遍历表数据数组,每一次循环处理一张表 */
foreach ($matches as $item) {
/* STEP2-1 初始化表数据 */
$table = array(
'name' => $item['name'],
'primary_key' => $item['primary_key'],
'engine' => $item['engine'],
'charset' => $item['charset'],
'comment' => $item['comment'],
'fields' => array(),
);
/* STEP2-2 处理字段部分,即CREATE TABLE括号中的部分,每一次循环处理一个字段 */
$fields_array = explode(',', $item['fields_str']);
array_pop($fields_array);
foreach ($fields_array as $fields_array_item) {
/* STEP2-2-1 匹配字段的属性 */
preg_match_all('/`(?P<name>\w+)`\s+(?P<type>\w+(?=\(|\s))(?P<length>\(\d+\))*.+?COMMENT\s\'(?P<comment>.+?)\'.*?/is', $fields_array_item, $matches, PREG_SET_ORDER);
$field = array(
'name' => $matches[0]['name'],
'type' => $matches[0]['type'].$matches[0]['length'],
'comment' => $matches[0]['comment'],
);
/* STEP2-2-2 判断生成当前字段的属性 */
$field['prop'] = array();
$field['prop']['auto_increment'] = TRUE && stripos($fields_array_item, 'auto_increment');
$field['prop']['unsigned'] = TRUE && stripos($fields_array_item, 'unsigned');
$field['prop']['zerofill'] = TRUE && stripos($fields_array_item, 'zerofill');
$field['not_null'] = TRUE && stripos($fields_array_item, 'not null');
$field['primary'] = $table['primary_key'] == $field['name'];
/* STEP2-2-3 当前字段是否有默认值,有则对其进行正则匹配 */
$has_default = TRUE && stripos($fields_array_item, 'default');
if ($has_default) {
preg_match_all('/DEFAULT\s+\'(?P<default>.*?)\'/is', $fields_array_item, $match, PREG_SET_ORDER);
$field['default'] = $match[0]['default'];
}
/* STEP2-2-4 存入返回的变量中 */
$table['fields'][] = $field;
}
/* STEP2-3 处理表的索引 */
preg_match_all('/(?P<keyname>KEY|INDEX|UNIQUE)\s+`(?P<indexname>\w+)`\s+\((?P<indexvalues>.+?)\)/is', $item['keys'], $match_keys, PREG_SET_ORDER);
if (!empty($match_keys)) {
foreach ($match_keys as $match_key) {
$match_key['indexvalues'] = str_replace('`', '', $match_key['indexvalues']);
//处理联合索引
if (strpos($match_key['indexvalues'], ',')){
$match_key['indexvalues'] = explode(',', $match_key['indexvalues']);
}
$table['index'][] = array(
'indexname' => $match_key['indexname'],
'unique' => strtolower($match_key['keyname']) == 'unique',
'indexvalues' => $match_key['indexvalues']
);
}
}
/* STEP2-4 */
$tables[] = $table;
}
/* STEP4 输出Markdown,每次循环处理一张表 */
$th = array('字段名', '类型', '空', '默认值', '属性', '备注');
$th = '|'.implode('|', $th).'|'."\n";
$th .= '|:---:|:---:|:---:|:---:|:---:|:---:|'."\n";
foreach ($tables as $table) {
/* STEP4-1 输出表结构 */
echo '#'.$table['name'].'('.$table['comment'].')'."\n";
echo $th;
foreach ($table['fields'] as $field) {
$prop_str_arr = '';
$field['primary'] && $prop_str_arr[] = '主键';
$field['prop']['auto_increment'] && $prop_str_arr[] = '自增';
$field['prop']['unsigned'] && $prop_str_arr[] = '非标记';
$field['prop']['zerofill'] && $prop_str_arr[] = '非标记并用零填充';
$arr = array($field['primary'] ? '**'.$field['name'].'**' : $field['name'], $field['type'], $field['not_null'] ? '非空' : '可为空', $field['default'], implode(',', $prop_str_arr), $field['comment'], );
echo '|'.implode('|', $arr).'|'."\n";
}
/* STEP4-2 输出表索引 */
if (!empty($table['index'])) {
$index_th = array('键名', '唯一', '字段');
$index_th = '|'.implode('|', $index_th).'|'."\n";
$index_th .= '|:---:|:---:|:---:|'."\n";
echo "\n";
echo "###索引\n";
echo $index_th;
foreach ($table['index'] as $index){
is_array($index['indexvalues']) && $index['indexvalues'] = implode(',', $index['indexvalues']);
$arr = array($index['indexname'], $index['unique'] ? '是' : '否', $index['indexvalues']);
echo '|'.implode('|', $arr).'|'."\n";
//print_r($index);echo "\n";
}
}
echo "\n-------------------------------------------\n\n";
}
exit;
}
```
- 一维数组操作方法
- 求得这个数组中各个元素之和
- 取出两个数组中相同的内容
- 将数组元素组合为字符串implode
- 将字符串转化为数组explode
- 逗号分割的字符串去重
- 一维数组增加某个值
- PHP从数组中找到指定元素的位置
- 二维或多维数组操作方法
- 根据某一个键值合并生成一个新的二维数组
- 二维数组变一维数组
- 二维数组取一个值变一维数组
- php二维数组合并及去重复的方法
- php数组根据某键值,把相同键值的合并最终生成一个新的二维数组
- 二维数组增加一个值
- 生成无限级树算法
- sql2md SQL转化为markdown语法
- PHP修改多维数组中的某个值
- 二维数组
- 省市区联动的查询
- PHP求某二维数组,某一列元素的最大最小值
- php 求二维数组的差集
- 按某个键值排序
- 基本知识
- 键名作为键值
- PHP中foreach的用法和实例
- PHP foreach 循环案例
- php5.3以后的foreach的&符号不建议使用
- PHP中判断变量为空的几种方法小结
- 判断PHP数组是否为空的代码
- php删除数组中指定值的元素的几种方法
- PHP删除数组中的指定元素
- php数组函数序列之array_keys() - 获取数组键名
- php 中更简洁的三元运算符 ?:
- 函数
- 字符串函数
- 数组函数
- 实例
- 将 $arr 中age大于第一个大于30的人增加一项一条信息
- 强大的数组函数