2014-10-06 3 views
0

나는 간단한 템플릿 엔진을 가지고 있으며 assoc 배열로부터 데이터를 받는데 문제가있다. 아무도 나에게 충고를 줄 수 있니? getStatisticData 메서드에서 assoc 배열을 첫 번째 변수 $data으로 지정합니다. 내 입력 배열의 형식은 :문자열 변환 php, assoc 배열

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

나는 그것이 foreach를 사용하여 데이터를 얻으려고하지만 그것이 작동하지 않습니다. 나는 TemplateGen.php에서 통지

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 및 관련 방법을 받고 있어요 :

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

,691,363 (210)

행 25 :

function add_percent($i) { 

행 28 :

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

UPDATE2 :
이론적으로, 새로운 메소드로 제공되는 모든 것이 잘 작동합니다. 그러나 I'am 대신 당신의 내 getStatisticData를 사용하는 경우 시작

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 
     ); 

에 있었다 그러나 같은 문제는 작동이 있지만 다른 많은 오류가 있습니다
내 방법 :

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 = $ value) {$ data [$ key] = $ value;'}?! 위의 주석에서 언급 한 바와 같이 –

+0

은'$ data [$ key] = $ value;'는'$ value = $ value;'또는'$ data [$ key] = $ data [$ key];' –

+0

btw,'TemplateGen'의 34 번째 줄은 어디에 있습니까? 또한 getReplaceTemplate이 아닌'getReplaceContent'를 게시했습니다. –

답변

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 루프 (이미 foreach 루프에서 각각 키와 값 점점로 플러스 $data[$key] = $value이 중복) 각 키/값 쌍에 대해 같은 일을하고, 그래서 당신은 루프를 제거하고이 같은 뭔가를 대체 할 수 : getReplaceContent에 대한 유사

protected function getStatisticData($data, $template){ 

    if ($data === false) { 
     return "We don't have any data in database"; 
    } 
    return $this->template_gen->getReplaceTemplate($data, $template); 
} 

을 - 당신은 기본적으로 검색 및 대체 값으로 배열의 키와 배열 값을 사용하고 있습니다. 새로운 배열을 만드는 대신 PHP의 편리한 array_keysarray_values을 사용할 수 있습니다. catch 키는 배열 키가 %으로 둘러싸여 있어야하지만, 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에 입력이 무엇인지 OP 분명하지 않지만이 예상되는 것 같습니다 연관 배열의 배열이 될 수 있습니다.

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; 
} 

샘플 입력 :이 그렇다면 다음과 같이 getStatisticData의 코드를 변경해야

$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

내가 연관 배열 $ 겠지 데이터에는 문자열이 포함되어 있습니다. 나는 $ 데이터 배열이 템플릿 자리 표시 자의 키와 값을 입력으로 가정한다고 가정합니다.

그렇다면 당신은 하나의 문자열을 얻으려고 노력하는 경우, 그리고,이 일을 생각해

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

감사합니다. 고쳤다. –