Преобразование массива в строку php, ассоциативный массив

У меня есть простой шаблонный движок, и у меня проблема с предоставлением ему данных из массива 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;

}

0

Решение

Ваш код в настоящее время довольно неэффективен, и это приводит к некоторым проблемам. Давайте посмотрим на первый метод, который вы опубликовали:

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>
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 петли. Нужно сделать просто отлично.

1

По вопросам рекламы [email protected]