从数据库PHP中检索的内爆值

时间:2016-11-25 08:57:52

标签: php codeigniter

如果我将值存储为S5001:31,32,33|S5002:42,44,46|S5003:21,23,25 ......等等。

在数据库中,如何使用implode函数检索值,以便我可以单独显示标记以查找HTML表中每个注册号码的总数?

$internalmark_col="mark_internal";
        $student_internal_marks_array = array();
        if(isset($student_internal_mark->$internalmark_col))
        {
            $internalmarks_stud_code_arr=explode(',',$student_internal_mark->$internalmark_col);
            foreach($internalmarks_stud_code_arr as $marks_each)
            {
                $internalcode_mark=explode(':',$marks_each);
                if(isset($internalcode_mark[0]) && isset($internalcode_mark[1]))
                    $student_internal_marks_array[$internalcode_mark[0]]=$internalcode_mark[1];
            }

        }

        print_r($student_internal_marks_array);
        exit;

对于上面的代码我得错了输出。期望的输出是:

Register No | Mark 1 | Mark 2 |Mark 3 | Total 
-------------------------------------

S5001       | 3 | 2 | 3 | 8

S5002       |4 | 4 |6 | 14

S5003       |1 |3 |5 | 9

4 个答案:

答案 0 :(得分:2)

从下面的代码中,您将获得所需的输出:

$data = "S5001:31,32,33|S5002:42,44,46|S5003:21,23,25";
    $d = explode("|",$data);
    foreach ($d as $value) {
        $register_no_arr = explode(":",$value);
        $register_no = $register_no_arr[0];
        $marks = explode(',',$register_no_arr[1]);
        echo '<br>Register No :- '.$register_no;
        for($i=0;$i<sizeof($marks);$i++){
            echo "<br>Mark ".($i+1)." :- ".$marks[$i];
        }

    }

答案 1 :(得分:2)

您可以使用preg_split来读取行参数:

$str = 'S5001:31,32,33|S5002:42,44,46|S5003:21,23,25';


$table = '<table>
<tr>
<th>Register No</th>
<th>Mark 1</th>
<th>Mark 2</th>
<th>Mark 3</th>
<th>Total</th>
</tr>';

$internalmarks_stud_code_arr=explode('|', $str);
foreach($internalmarks_stud_code_arr as $marks_each)
{   
    list($num, $m1, $m2, $m3) = preg_split('/(:|,)/',$marks_each);
    $table .= '
        <tr>
            <td>'.$num.'</td>
            <td>'.$m1.'</td>
            <td>'.$m2.'</td>
            <td>'.$m3.'</td>
            <td>'.($m1 + $m2 + $m3).'</td>
        </tr>';

}
$table .='</table>';         
print $table;

preg_split是一个core function,它允许您使用正则表达式来爆炸字符串。在这种情况下,我已经知道由和分隔的元素之和是固定的(4项),所以我也可以使用list核心函数将分割结果保存在四个定义的变量中($ num,$ m1,$ m2,$ m3)

list($num, $m1, $m2, $m3) = preg_split('/(:|,)/',$marks_each);

我使用的正则表达式/(:|,)/由/它们是php正则表达式分隔符和圆括号()之间的组语法组成。管道分组语法的意思是“或”,所以这个(:|,)表示“find:OR”。由于我的替换模式非常简单,并且不需要使用组,因此它也可以写成这样的范围:/ [,:] /并且它甚至是更好的选择

答案 2 :(得分:1)

$tot =0;
$internalmark_col = S5001:31,32,33|S5002:42,44,46|S5003:21,23,25;
$m = explode('|',$internalmark_col);
echo '<tr>';
foreach($m as $mark){
    $scode = explode(':',$mark);
    echo '<td>'.$scode[0].'</td>';
    $code = $scode[1];
    $smark = explode(',',$code);
    foreach($smark as $student_mark){
        echo '<td>'.$student_mark.'</td>';
        $tot += $student_mark;
    }
    echo '<td>'.$tot.'</td>';
}
echo '</tr>';

答案 3 :(得分:0)

试试这个:

$array = 'S5001:31,32,33';
$str = str_replace(":", ",", $array);

list($register, $mark1, $mark2, $mark3) = explode(',', $str);

echo "<br>Register:" . $register . "<br>Mark1:" . $mark1 . "<br>Mark2:" . $mark2 . "<br>Mark3:" . $mark3;