数组到字符串转换php,assoc数组

时间:2014-10-06 22:33:43

标签: php arrays templates associative-array

我有一个简单的模板引擎,我有一个问题,从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}}

2 个答案:

答案 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_keysarray_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个循环。一个人应该做得很好。