2014-10-06 3 views
0

У меня есть простой механизм шаблона, и у меня есть проблема с предоставлением ему данных из массива-адреса. Может ли кто-нибудь дать мне совет? В методе getStatisticData я даю массив-символ как первую переменную $data. Мой входной массив в виде:Array to string conversion php, array array

[0] => Array 
    (
     [OrderNumber] => 1 
     [Name] => Zahid 
     [Total revenue] => 8363.38 
    ) 

Я пытаюсь получить данные из него с помощью foreach, но он не работает. Я получаю уведомление

Notice: Array to string conversion in C:\Server\htdocs\Task\lib\TemplateGen.php on line 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"); 
    } 

UPDATE:

Я получил 2 новые ошибки

Warning: implode(): Invalid arguments passed in C:\Server\htdocs\Task\lib\TemplateGen.php on line 28 Fatal error: Cannot redeclare add_percent() (previously declared in C:\Server\htdocs\Task\lib\TemplateGen.php:25) in C:\Server\htdocs\Task\lib\TemplateGen.php on line 25

Линия 25:

function add_percent($i) { 

Линия 28:

return implode("", str_replace(array_map("add_percent", array_keys($dataString)), array_values($dataString),$content)); 

UPDATE2:
В теории, все предусмотрено в новом методе должны работать очень хорошо. Но есть те же самые проблемы, которые были в начале

Notice: Array to string conversion in C:\Server\htdocs\Task\lib\TemplateGen.php on line 44`
line 44 :

return str_replace(
      array_map($addPercent, array_keys($data)), array_values($data), $template 
     ); 

Но если I'am используя мой 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; 

    } 
+2

Почему вы это делаете: 'foreach ($ data as $ key => $ value) {$ data [$ key] = $ value;'}?! –

+0

, как указано в приведенном выше комментарии, '$ data [$ key] = $ value;' такое же, как '$ value = $ value;' или '$ data [$ key] = $ data [$ key];' –

+0

btw, где строка 34 «TemplateGen»? Вы также разместили 'getReplaceContent', а не' getReplaceTemplate'. –

ответ

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> 

EDIT: не ясно из ОП, что вход в 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> 
+0

Хм, действительно интересное решение, не знал об этом. Но сейчас проблема заключается в том, что сервер не хочет загружать что-то новыми методами, это бесконечная загрузка прямо сейчас. – vladja

+0

Вам нужно будет отредактировать один или несколько ваших методы, если вы хотите, чтобы код работал, к сожалению! –

+0

спасибо, постараемся найти ошибку. – vladja

1

Я предполагаю, что ассоциативный массив $ данные имеют просто строки. Я предполагаю, что массив $ 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 петель. Нужно делать все отлично.

+0

@i встревожен: вы правы. Починил это. –