应用场景:游戏中的很多业务已经迁移到了redis上,但是redis中的数据在运维层面很难展现,通过php-redis将redis中的set或者hash转换为php中的array,然后映射为html中的table
主要设计点:table的基本单位是单元格row_field_node,多个row_field_node组成row_data, tile + 多个row_data = table。因为每个单元格都可能有对应的超链接响应,
所以row_field_node数据结构是这样的:
class row_field_node
{
public $data; //显示的数据
public $action; //对应的超链接
public $param; //超链接需要传入的参数
public $target; //超链接要展现在那个frame中
public function __construct($data, $action, $param, $target)
{
$this->data = $data;
$this->action = $action;
$this->param = $param;
$this->target = $target;
}
}
array中的数组与hash可以输出为html table或者是csv文件,具体实现见代码:
header("Content-type: text/html; charset=utf-8");
$domain_name = "192.168.1.1";
class row_field_node
{
public $data;
public $action;
public $param;
public $target;
public function __construct($data, $action, $param, $target)
{
$this->data = $data;
$this->action = $action;
$this->param = $param;
$this->target = $target;
}
}
class xtable
{
private $title_list,$row_list,$fonts,$table_tag;
public function __construct()
{
$this->title_list=array(); // strings with titles for first row
$this->row_list=array(); // data to show on cells
$this->fonts=array("#EEEEEE","#CCEEEE"); // background colors for odd and even rows
$this->table_tag=""; // extra html code for table tag
}
public function set_table_tag($table_tag) // add some html code for the tag table
{
$this->table_tag=$table_tag;
}
public function background($fonts)
{
if (is_array($fonts))
{
$this->fonts=$fonts;
}
else
{
$this->fonts=array($fonts,$fonts);
}
}
public function addrow($row_data)
{
$this->row_list[]=$row_data;
}
public function hash_output($data)
{
$this->title_list=array("field", "value");
foreach($data as $key=> $value)
{
$row_data = array();
$field_data = new row_field_node($key, "", "", "");
array_push($row_data, $field_data);
$field_data = new row_field_node($value, "", "", "");
array_push($row_data, $field_data);
$this->addrow($row_data);
}
return $this->html();
}
public function set_output($title, $data, $desc = '')
{
$this->title_list = $title;
$this->row_list = $data;
echo "total:".count($data).' '.$desc . "
";
return $this->html();
}
public function html()
{
$cfondos=$this->fonts;
//output title
$output_content="
";$t_count=count($this->title_list);
for($t_idx = 0; $t_idx < $t_count; $t_idx++)
{
$output_content.=sprintf("
%s",$this->title_list[$t_idx]);}
$output_content.="
";//start outputing data rows
$table_row_content="";
$row_count=count($this->row_list);
for($row_idx = 0; $row_idx < $row_count; $row_idx++)
{
$table_row_content .= sprintf("
", $this->fonts[$row_idx % 2]);$line_data_list = $this->row_list[$row_idx];
$col_count = count($line_data_list);
if($col_count != $t_count)
{
echo "row field count not match title count|col:".$col_count."|title:".$t_count;
exit;
}
for($col_idx = 0; $col_idx < $col_count; $col_idx++)
{
Global $domain_name;
if($line_data_list[$col_idx]->action != "")
{
//echo $line_data_list[$col_idx]->action."----".$line_data_list[$col_idx]->param."----".$line_data_list[$col_idx]->target."----".$line_data_list[$col_idx]->data."===============";
$table_row_content.=sprintf("
%s ",$line_data_list[$col_idx]->action, $line_data_list[$col_idx]->param, $line_data_list[$col_idx]->target,
$line_data_list[$col_idx]->data);
}
else
{
$table_row_content.=sprintf("
%s ", $line_data_list[$col_idx]->data);}
}
$table_row_content.="
";}
return sprintf("
",$this->table_tag,$output_content,$table_row_content);}
public function csv_output($title, $data)
{
$this->title_list = $title;
$this->row_list = $data;
echo "total:".count($data)."
";
return $this->csv();
}
public function csv()
{
$file_name = time(0).".rar";
$fp = fopen($file_name, 'w');
$t_count=count($this->title_list);
//start outputing data rows
$row_count=count($this->row_list);
$file_data = "";
$csv_row_data = "";
for($t_idx = 0; $t_idx < $t_count; $t_idx++)
{
$csv_row_data = $csv_row_data." ".$this->title_list[$t_idx];
}
$file_data = $file_data.$csv_row_data."\n";
for($row_idx = 0; $row_idx < $row_count; $row_idx++)
{
$line_data_list = $this->row_list[$row_idx];
$col_count = count($line_data_list);
if($col_count != $t_count)
{
echo "row field count not match title count|col:".$col_count."|title:".$t_count;
exit;
}
$csv_row_data = "";
for($col_idx = 0; $col_idx < $col_count; $col_idx++)
{
Global $domain_name;
$csv_row_data = $csv_row_data." ".$line_data_list[$col_idx]->data;
}
$file_data = $file_data.$csv_row_data."\n";
}
fwrite($fp, $file_data);
Global $domain_name;
echo "csvfile:$file_name";
}
}
?>
示例:
$real_server_list = array();
foreach($server_list as $server_key)
{
$temp_array = explode(":", $server_key);
$filed_node = new row_field_node();
$filed_node->data = $temp_array[1];
$filed_node->action = "cupteam/get_guild_list_output.php";
$filed_node->param = "input_id=".$filed_node->data;
$filed_node->target = "detail";
$row_data = array($filed_node);
array_push($real_server_list, $row_data);
}
$t1=new xtable();
echo $t1->set_output(array("server_id"), $real_server_list);
效果: