我有一个简单的模板引擎,我有一个问题,从assoc数组给它一个数据。任何人都可以给我一个建议吗?在方法getStatisticData
中,我将一个assoc数组作为第一个变量$data
。我的输入数组的格式为:
[0] => Array
(
[OrderNumber] => 1
[Name] => Zahid
[Total revenue] => 8363.38
)
我尝试使用foreach
从中获取数据,但它无法正常工作。我注意到了
注意:第34行的C:\ Server \ htdocs \ Task \ lib \ TemplateGen.php中的数组到字符串转换
protected function getStatisticData($data, $template){
$text = "";
if($data === false) {
return "We don't have any data in database";
}
foreach($data as $key => $value){
$data[$key] = $value;
$text .= $this->template_gen->getReplaceTemplate($data ,$template);
}
return $text;
}
getReplaceContent
以及来自TemplateGen.php
的相关方法:
private function getReplaceContent($dataString, $content)
{
$search = array();
$replace = array();
$i = 0;
foreach ($dataString as $key => $value) {
$search[$i] = "%$key%";
$replace[$i] = $value;
$i++;
}
return str_replace($search, $replace, $content); ## LINE 34
}
function getReplaceTemplate($dataString, $template)
{
return $this->getReplaceContent($dataString, $this->getTemplate($template));
}
function getTemplate($name)
{
return $content = file_get_contents($this->config->tpl_path . $name . ".tpl");
}
更新
我收到了2个新错误
警告:implode():在第28行的C:\ Server \ htdocs \ Task \ lib \ TemplateGen.php中传递的参数无效 致命错误:无法在第25行的C:\ Server \ htdocs \ Task \ lib \ TemplateGen.php中重新声明add_percent()(先前在C:\ Server \ htdocs \ Task \ lib \ TemplateGen.php:25中声明)
第25行:
function add_percent($i) {
第28行:
return implode("", str_replace(array_map("add_percent", array_keys($dataString)), array_values($dataString),$content));
UPDATE2:
从理论上讲,新方法提供的一切都应该很好。但是在开始时也存在同样的问题
注意:第44行的C:\ Server \ htdocs \ Task \ lib \ TemplateGen.php中的数组到字符串转换。 第44行:
return str_replace(
array_map($addPercent, array_keys($data)), array_values($data), $template
);
但如果我正在使用我的getStatisticData
代替您的 protected function getStatisticData($data, $template){
$text = array();
if($data === false) {
return "We don't have any data in database";
}
$i=0;
foreach($data as $dataString){
if (!empty($data[$i+1])){
foreach($dataString as $key => $value){
$dataString[$i][$key] = $dataString[$i][$value];
}}
$text .= $this->template_gen->getReplaceTemplate($dataString ,$template);
}
return $text;
}
,那么它可以正常运行,但还有很多其他错误
我的方法:
{{1}}
答案 0 :(得分:1)
目前你的代码效率很低,而且它导致了一些问题。让我们看看你发布的第一个方法:
protected function getStatisticData($data, $template){
$text = "";
if($data === false) {
return "We don't have any data in database";
}
foreach($data as $key => $value){
$data[$key] = $value;
$text .= $this->template_gen->getReplaceTemplate($data ,$template);
}
return $text;
}
foreach
循环对每个键/值对执行相同的操作(加$data[$key] = $value
是冗余的,因为您已经在foreach
循环中获取了每个键和值),所以你可以消除循环,并用这样的东西替换它:
protected function getStatisticData($data, $template){
if ($data === false) {
return "We don't have any data in database";
}
return $this->template_gen->getReplaceTemplate($data, $template);
}
类似于getReplaceContent
- 您基本上使用数组键和数组值作为搜索和替换值。您可以使用PHP的方便array_keys
和array_values
而不是构建新数组。问题是数组键需要被%
包围,但使用array_map
很容易做到 - 只需定义一个函数,它将接受一个字符串并将%
添加到结束它,然后array_map
它到您的数组键:
private function getReplaceContent($data, $template)
{
$addPercent = function( $i ){
return "%$i%";
};
return str_replace(
array_map( $addPercent, array_keys($data)), array_values($data), $template
);
}
现在,调用getStatisticData
将返回包含所有替换数据的模板文本。
示例输入:
$arr = array(
'OrderNumber' => 1,
'Name' => 'Zahid',
'Total revenue' => '8363.38'
);
$template =
'<p>Name: %Name%<br>
Total revenue: %Total revenue%<br>
Order number: %OrderNumber%</p>';
getStatisticData
的输出:
<p>Name: Zahid<br>
Total revenue: 8363.38<br>
Order number: 1</p>
编辑:从OP中不清楚getStatisticData
的输入是什么,但看起来它应该是一个关联数组的数组。如果是这样,getStatisticData
的代码应改变如下:
protected function getStatisticData($dataArray, $template){
if ($dataArray === false) {
return "We don't have any data in database";
}
$text = "";
foreach ($dataArray as $aa) {
$text .= $this->template_gen->getReplaceTemplate($aa, $template);
}
return $text;
}
示例输入:
$arr =
[
[ 'OrderNumber' => 1,
'Name' => 'Zahid',
'Total revenue' => '8363.38'
],
[ 'OrderNumber' => 2,
'Name' => 'Paul',
'Total revenue' => '123.45'
],
[ 'OrderNumber' => 3,
'Name' => 'Jane',
'Total revenue' => '567.89'
],
];
输出:
<p>Name: Zahid<br>
Total revenue: 8363.38<br>
Order number: 1</p>
<p>Name: Paul<br>
Total revenue: 123.45<br>
Order number: 2</p>
<p>Name: Jane<br>
Total revenue: 567.89<br>
Order number: 3</p>
答案 1 :(得分:1)
我假设关联数组$ data中只包含字符串。我假设$ data数组的键作为模板占位符,值作为要输入的值。
如果是这样,如果您尝试获取单个字符串,请考虑这样做:
protected function getStatisticData($data, $template) {
if ($data === false) {
return "We don't have any data in the database.";
}
return this->template_gen->getReplaceTemplate($data, $template);
}
private function getReplaceContent($dataString, $content) {
content = '';
foreach ($dataString as $key => $value) {
$content .= str_replace("%{$key}%", $value, $content);
}
return $content;
}
您不需要那么多foreach
个循环。一个人应该做得很好。