У меня есть простой шаблонный движок, и у меня проблема с предоставлением ему данных из массива Assoc. Кто-нибудь может дать мне совет? В методе getStatisticData
Я даю массив ассоциаций в качестве первой переменной $data
, Мой входной массив имеет вид:
[0] => Array
(
[OrderNumber] => 1
[Name] => Zahid
[Total revenue] => 8363.38
)
Я пытаюсь получить данные с помощью foreach
но это не работает Я получаю уведомление
Примечание: преобразование массива в строку в C: \ Server \ htdocs \ Task \ lib \ TemplateGen.php в строке 34
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 (): неверные аргументы переданы в C: \ Server \ htdocs \ Task \ lib \ TemplateGen.php в строке 28
Неустранимая ошибка: невозможно повторно объявить add_percent () (ранее объявленный в C: \ Server \ htdocs \ Task \ lib \ TemplateGen.php: 25) в 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:
Теоретически все, что предусмотрено в новом методе, должно работать очень хорошо. Но есть те же проблемы, которые были в начале
Примечание: преобразование массива в строку в C: \ Server \ htdocs \ Task \ lib \ TemplateGen.php в строке 44`
строка 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;
}
Ваш код в настоящее время довольно неэффективен, и это приводит к некоторым проблемам. Давайте посмотрим на первый метод, который вы опубликовали:
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
loop), чтобы вы могли исключить цикл и заменить его следующим образом:
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>
РЕДАКТИРОВАТЬ: из ОП не ясно, что вход в 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>
Я предполагаю, что в ассоциативном массиве $ 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
петли. Нужно сделать просто отлично.