在foreach()循环中合并/追加来自不同ID的值

时间:2014-01-20 10:59:23

标签: php codeigniter loops foreach

我不确定我是否有正确的头衔,但在这里我走了。我目前使用CodeIgniter开发应用程序。假设我有一个包含当前记录的数据库对象:

----------------------------------------------------------------
-- ID -- SurveyID  -- UserID  -- Value1  -- Value2  -- Marker --
----------------------------------------------------------------
--  1 --     1     --    1    --    5    --    3    --    A   --
--  2 --     1     --    1    --    5    --    3    --    B   --
--  3 --     1     --    1    --    5    --    1    --    C   --
--  4 --     1     --    1    --    5    --    3    --    D   --
--  5 --     1     --    1    --    5    --    3    --    E   --
--  6 --     2     --    2    --   10    --    7    --    A   --
--  7 --     2     --    2    --   10    --    7    --    B   --
--  8 --     2     --    2    --   10    --    7    --    C   --
--  9 --     2     --    2    --   10    --    7    --    D   --
-- 10 --     2     --    2    --   10    --    7    --    E   --
-- 11 --     2     --    3    --   12    --    17   --    A   --
-- 12 --     2     --    3    --   12    --    17   --    B   --
-- 13 --     2     --    3    --   12    --    17   --    C   --
-- 14 --     2     --    3    --   12    --    17   --    D   --
-- 15 --     2     --    3    --   12    --    17   --    E   --
----------------------------------------------------------------

我有一个从数据库生成表输出的代码:

$tableOutput = '
<table class="table table-bordered">
    <tr>
        <td>Survey ID = '.$user_data_list->SurveyID.'</td>
    </tr>
    <tr>
        <td>A</td>
        <td>B</td>
        <td>C</td>
        <td>D</td>
        <td>E</td>
        <td>A</td>
        <td>B</td>
        <td>C</td>
        <td>D</td>
    </tr>
';

foreach ($object as $user_data_list)
{
    $tableOutput .= '<tr>'; // Row opening
    $tableOutput .= '<td>'.$user_data_list->Value1.'</td>'; // Marker A value1
    $tableOutput .= '<td>'.$user_data_list->Value1.'</td>'; // Marker B value1
    $tableOutput .= '<td>'.$user_data_list->Value1.'</td>'; // Marker C value1
    $tableOutput .= '<td>'.$user_data_list->Value1.'</td>'; // Marker D value1
    $tableOutput .= '<td>'.$user_data_list->Value1.'</td>'; // Marker E value1

    $tableOutput .= '<td>'.$user_data_list->Value2.'</td>'; // Marker A value2
    $tableOutput .= '<td>'.$user_data_list->Value2.'</td>'; // Marker B value2
    $tableOutput .= '<td>'.$user_data_list->Value2.'</td>'; // Marker C value2
    $tableOutput .= '<td>'.$user_data_list->Value2.'</td>'; // Marker D value2
    $tableOutput .= '<td>'.$user_data_list->Value2.'</td>'; // Marker E value2
    $tableOutput .= '<tr>'; // Row closing
}

$tableOutput .= '</table>';

将生成:

----------------------------------------------------
-- Survey ID = 1                                  --
----------------------------------------------------
-- A -- B -- C -- D -- E -- A -- B -- C -- D -- E --
----------------------------------------------------
-- 5 -- 5 -- 5 -- 5 -- 5 -- 3 -- 3 -- 1 -- 3 -- 3 --
----------------------------------------------------

----------------------------------------------------
-- Survey ID = 2                                  --
----------------------------------------------------
-- A -- B -- C -- D -- E -- A -- B -- C -- D -- E --
----------------------------------------------------
--10 --10 --10 --10 --10 -- 7 -- 7 -- 7 -- 7 -- 7 --
----------------------------------------------------
--12 --12 --12 --12 --12 --17 --17 --17 --17 --17 --
----------------------------------------------------

上面的表格看起来很好,但我对Survey ID 2有疑问。输出必须在一行中,因为它是基于UserID 2和3的所有结果的结果。这是我的预期输出:

----------------------------------------------------
-- Survey ID = 1                                  --
----------------------------------------------------
-- A -- B -- C -- D -- E -- A -- B -- C -- D -- E --
----------------------------------------------------
-- 5 -- 5 -- 5 -- 5 -- 5 -- 3 -- 3 -- 1 -- 3 -- 3 --
----------------------------------------------------

----------------------------------------------------
-- Survey ID = 2                                  --
----------------------------------------------------
-- A -- B -- C -- D -- E -- A -- B -- C -- D -- E --
----------------------------------------------------
--22 --22 --22 --22 --22 --24 --24 --24 --24 --24 --
----------------------------------------------------

如何在foreach()内部编码,以便我可以获得预期的输出?我希望数据库设计没有任何问题。

更新:http://pastebin.com/ZYyJD6fA&gt;&gt;这是$ object值。你会注意到$ object值和上面的问题之间的区别。上面的问题是简化版。重要的列包括:survey_iduser_idvalue1value2marker。其余的并不重要。

谢谢!

2 个答案:

答案 0 :(得分:0)

对于foreach循环的每次迭代,您都没有清除先前的迭代值。     $ tableOutput。='';

将foreach更改为以下内容:

 foreach ($object as $user_data_list)
    {
        $tableRowOutput = '<tr>'; // Row opening
        $tableRowOutput .= '<td>'.$user_data_list->Value1.'</td>'; // Marker A value1
        $tableRowOutput .= '<td>'.$user_data_list->Value1.'</td>'; // Marker B value1
        $tableRowOutput .= '<td>'.$user_data_list->Value1.'</td>'; // Marker C value1
        $tableRowOutput .= '<td>'.$user_data_list->Value1.'</td>'; // Marker D value1
        $tableRowOutput .= '<td>'.$user_data_list->Value1.'</td>'; // Marker E value1

        $tableRowOutput .= '<td>'.$user_data_list->Value2.'</td>'; // Marker A value2
        $tableRowOutput .= '<td>'.$user_data_list->Value2.'</td>'; // Marker B value2
        $tableRowOutput .= '<td>'.$user_data_list->Value2.'</td>'; // Marker C value2
        $tableRowOutput .= '<td>'.$user_data_list->Value2.'</td>'; // Marker D value2
        $tableRowOutput .= '<td>'.$user_data_list->Value2.'</td>'; // Marker E value2
        $tableRowOutput .= '<tr>'; // Row closing

        $tableOutput .= $tableRowOutput;
    }

答案 1 :(得分:0)

bout如何做到这一点。 为输出创建新函数?

<?php
/*
PLEASE TRY BETTER SOLUTION
*/
for($SurveyID=1;$SurveyID<=2;$SurveyID++)
{
    $tableOutput = '
    <table class="table table-bordered">
        <tr>
            <td>Survey ID = '.$SurveyID.'</td>
        </tr>
        <tr>
            <td>A</td>
            <td>B</td>
            <td>C</td>
            <td>D</td>
            <td>E</td>
            <td>A</td>
            <td>B</td>
            <td>C</td>
            <td>D</td>
        </tr>
    ';
    echo $tableOutput;
    $s='<tr>';

    $aksara=array('','A','B','C','D','E'); 
    for($i1=1;$i1<=2;$i1++)
    {
        for($i2=1;$i2<count($aksara);$i2++)
        {
            $s.="<td>".$this->userdata_model
                     ->valueSurvei($SurveyID,$i1,$aksara[$i2])."</td>\n";
        }

    }

    $s.="</tr></table>";
    echo $s;
}

//==========================userdata_model.php======
function valueSurvei($survei, $pos, $marker)
{
    $field=$pos==1?'Value1':'Value2';
    $sql="select sum($field) s from table where SurveyID=$survei and Marker ='$marker'";
    $dt=$this->db->query($sql)->row_array();
    return $dt['s'];
}