清单二:生成的数据
int_10 char_A abc 100
int_11 char_B 123 102
int_12 char_C xyz 104
int_13 char_D 100 106
int_14 char_E 101 108
int_15 char_F 102 110
int_16 char_G 103 112
int_17 char_H 104 114
int_18 char_I 105 116
int_19 char_J 106 118
代码实现:
第一步:解析 ini 文件
error_reporting(0);
$iniFile = $argv[1]; // 第一个参数为配置文件。
$dataCount = $argv[2]; // 第二个参数为要生成的记录数。
$fields = parse_ini_file($iniFile, true); // 将 ini 配置文件转换为一个数组。
第二步:生成每一个字段的取值列表
foreach($fields as $fieldName => $field)
{
$list = array();
$equalPos = strpos($field['datatype'], '='); // 取得等号的为止。 range=[]
$range = substr($field['datatype'], $equalPos + 2, -1); // 取得 range 的列表(去掉了 [])
$items = explode(',', $range); // 得到所有的 item 元素。
/* 循环处理每一个 item,如果是一个区间,则调用 range 函数。 */
foreach($items as $item)
{
if(strpos($item, '-'))
{
list($min, $max) = explode('-', $item);
$list = array_merge($list, range($min, $max)); // 追加到 field 的 list 列表中。
}
else
{
$list[] = $item;
}
}
$field['list'] = $list; // 将最终的 list 列表赋值给 field 。
$field['pointer'] = 0; // 初始化这个列表的指针。
$fields[$fieldName] = $field; // 写回整个 fields 数组。
}
第三步:循环输出数据
/* 循环输出数据。 */
for($i = 0; $i < $dataCount; $i ++)
{
foreach($fields as $fieldName => $field)
{
$pointer = $field['pointer'];
/* 如果指针已经到到了列表的尾部,重新指向列表开始。 */
if($pointer == count($field['list'])) $pointer = 0;
echo $field['prefix']; // 输出前缀。
echo $field['list'][$pointer]; // 输出当前指针所对应的列表中的取值。
echo $field['postfix']; // 输出后缀。
$pointer ++;
$fields[$fieldName]['pointer'] = $pointer;
}
echo "\n";
}
这样我们用了不到 50 行的代码就完成了一个基本的数据生成工具。这其实已经可以满足基本的数据生成任务了。但是还需要进一步进行完善。
需要进一步完善的地方
第一:数据的扩展性
虽然 list 类型已经足够灵活,但有时候还无法满足需要。比如一个比较复杂的字段,由若干小字段组成。这时可以将这个复合字段再通过一个 ini 文件来定义,这样就有了无限可能。
比如,我们在 example.ini 文件中增加一个日期的字段,格式为 yyyy 年 mm 月 dd 日的格式
清单三:example.ini 中新增一个字段
[field5]
prefix=""
datatype="custom" " 定义这个字段的数据类型为 custom
datacfg="custom.ini" " 定义这个字段的配置文件为 custom.ini
postfix=""
清单四:custom.ini
[field5.1]
prefix=""
datatype="list, range=[1980-1999]"
postfix=" 年 "
[field5.2]
prefix=""
datatype="list, range=[1-12]"
postfix=" 月 "
[field5.3]
prefix=""
datatype="list, range=[1-31]"
postfix=" 日 "
这可以通过 php 中的递归函数来实现这个解析。即当解析到一个字段发现是自定义类型的时候,就读取这个字段所对应的 ini 配置文件,然后再解析它的每一个字段。具体的代码就不给出了,读者朋友们可以尝试实现。
第二:列表可以更加灵活
列表 range 参数还可以更加灵活,比如:
1. 可以指定步长:range=[1-100:2],表示从 1 到 100,步长为 2 递增。
原文转自:http://www.uml.org.cn/Test/201204263.asp