为数组的键和值对提供自定义名称

时间:2018-08-20 17:57:56

标签: php arrays

我有一个名为问题,格式如下:

表名:问题

     qn_id    |          question                          |
   ---------------------------------------------------------------

        19    | What is your rating on your Team Work?

        20    | What is your rating on your Skills?

        21    | What is your rating on your Personal Quality?

我还有一个名为 rating 的表,如下所示:

表名: 评分

id  | employee_id | question_id | self_score  | supervisor_score
-----------------------------------------------------------------

1   |  205        |  19         |    4        |     3
2   |  205        |  20         |    5        |     4
3   |  205        |  21         |    4        |     5

注意:提供分数涉及两个人。一个是 supervisee ,另一个是 supervisor

supervisee 提供的分数保留在名为 self_score 的列中。在表中, employee_id supervisee id 主管还为问题提供了评分监督,如表中所示。

>

我已经从数据库中生成了数据作为 Array ,如下所示:

$params = Array
                (
                [selfscore_19]       => 4
                [supervisorscore_19] => 3

                [selfscore_20]       => 5
                [supervisorscore_20] => 4

                [selfscore_21]       => 4
                [supervisorscore_21] => 5
                )

注意:在名为 [selfscore_19] 的键中, selfscore _ 是字符串,而 19 是问题ID。

问题与“ 自我”和“ 主管”都相同。

因此,我在 question_id 后面附加了名为“ selfscore ”和“ supervisorscore ”的字符串。

在下面显示的数组中,键为: [selfscore_19] ,该值已附加 question_id ,即 19 和 值是“ 自我”提供的得分,该得分为 4

其他数据也遵循类似的模式。

尝试:

下面的代码显示了到目前为止我所做的尝试:

注意:我只展示了该方法的主要部分。

    foreach($params as $key => $value){
        $exp_key = explode('_', $key);
        if($exp_key[0]=='selfscore'){
            $arr_result[] = $value;
        } 
    }

    foreach($params as $key => $value){
        $exp_key = explode('_', $key);
        if($exp_key[0]=='supervisorscore'){
            $arr_result[] = $value;

        }
    }

    if(isset($arr_result)){
        echo '<pre>';
        print_r($arr_result);
        echo '<pre>';
    }

这是上面代码的输出:

当前输出:

Array
(
    [0] => 4
    [1] => 5
    [2] => 4

    [3] => 3
    [4] => 4
    [5] => 5
)

现在,我想以以下输出的形式转换当前输出。 尽管我已经对此案例进行了研究,但是我发现它有些棘手。 我应该做什么修改才能达到要求的输出? 建议受到高度赞赏。

必需的输出:

$score['self_score']=array(
            array('question_id'=>19,'score'=>4)
            array('question_id'=>20,'score'=>5)
            array('question_id'=>21,'score'=>4)
        );

$score['supervisor_score']=array(
            array('question_id'=>19,'score'=>3),
            array('question_id'=>20,'score'=>4)
            array('question_id'=>21,'score'=>5)
        );

2 个答案:

答案 0 :(得分:0)

单循环执行。将$exp_key的第一部分用作结果数组的键,并将第二部分用作子数组的question_id键的值。

foreach ($arr_result as $key => $value) {
    $exp_key = explode("_", $key);
    $score[$exp_key[0]][] = array("question_id" => $exp_key[1], "score" => $value);
}

答案 1 :(得分:0)

我认为我建议您使用UNION来连接两个简单查询,以便您的初始结果集非常接近您想要的结果(足够简单地进行迭代和/或修改)。

SQL:(Demo

(SELECT 'group' AS 'self_score', question_id, self_score
FROM rating
WHERE employee_id = 205
ORDER BY id)
UNION
(SELECT 'supervisor_score', question_id, supervisor_score
FROM rating
WHERE employee_id = 205
ORDER BY id)

结果集:

       group      |  question_id  |  self_score
------------------|---------------|------------
    self_score    |      19       |      4
    self_score    |      20       |      4
    self_score    |      21       |      5
supervisor_score  |      19       |      3
supervisor_score  |      20       |      4
supervisor_score  |      21       |      5

如果您愿意使用PDO解决方案,fetchAll(PDO::FETCH_GROUP)将非常方便。