Codeigniter在数据库结果中生成数组

时间:2015-02-08 15:07:49

标签: php mysql arrays codeigniter

首先,我尝试在互联网上寻找解决方案。但我真的不知道要搜索什么,因为我没有正确的话。也许有人可以指出我已经给出的答案。

所以这是我的“问题”:

我的数据库中有3个表:user,task,user_task。

用户包含课程用户。任务包含任务。而user_task是一个关系表。它包含任务的id和用户的id。 (一个任务可以有多个用户,这就是我这样做的原因。)

我想做的事情很简单。我想获得所有任务的列表以及用户分配给它的每个任务。

这样的事情: 任务ID:1,名称:做菜,用户:bob,liam。

据我所知,如果分配了2个用户,我只需要打印两次任务。到目前为止,我使用了一个mysql查询。不是CI特定的。

查询返回一个带有2行的result(),1表示用户bob的任务,1表示与用户liam相同的任务。

array{
      array{
            task_id = "1",
            name = "do dishes",
            user = "bob"
           }

      array{
            task_id = "1",
            name = "do dishes",
            user = "liam"
           }

      array{
            task_id = "2",
            name = "vacuum",
            user = "liam"
           }

      array{
            task_id = "3",
            name = "Take out thrash",
            user = "liam"
           }

      array{
            task_id = "3",
            name = "Take out thrash",
            user = "bob"
           }
}

我想得到的结果是包含任务的1行,并且在该行中我想要一个数组,其中包含分配给它的每个用户名。

array{
      array{
            task_id = "1",
            name = "do dishes",
            user = array( "bob", "liam" )
           }
      array{
            task_id = "2",
            name = "vacuum",
            user = array( "liam" )
           }
      array{
            task_id = "3",
            name = "Take out thrash",
            user = array( "liam", "bob" )
           }
}

有没有办法实现这个目标?在CI和/或MySQL中?

我希望你们可以帮助我,如果我有点不清楚随意问一些规格。 正如我所说:如果已经有任何答案,请指出我!

提前致谢!

干杯。

3 个答案:

答案 0 :(得分:2)

,CI Active Records中没有任何选项可以实现这一目标 你必须循环你的结果。

<?php

$result = array(
    array(
            'task_id' => 1,
            'name' => 'do dishes',
            'user' => 'bob'
        ),
    array(
            'task_id' => 1,
            'name' => 'do dishes',
            'user' => 'liam'
        ),
    array(
            'task_id' => 2,
            'name' => 'vacuum',
            'user' => 'liam'
        ),
    array(
            'task_id' => 3,
            'name' => 'Take out thrash',
            'user' => 'liam'
        ),
    array(
            'task_id' => 3,
            'name' => 'Take out thrash',
            'user' => 'bob'
        ),
    );


function get_arrayvalues_bykeyvalue($array, $key, $key2, $v2)
{
    $ret = array();
    foreach($array as $arr)
    {
        foreach($arr as $k => $v)
        {
            if($arr[$key2] == $v2)
            {
                if($k == $key)
                    $ret[] = $v;   
            }
        }
    }
    $u = array_unique($ret);
    return (sizeof($u) == 1) ? $u[0] : $u;
}

$res = array();
foreach($result as $arr)
{
    foreach($arr as $k => $v)
    {
        if($k == 'user')
            $res[$arr['task_id']][$k] = get_arrayvalues_bykeyvalue($result, $k, 'task_id', $arr['task_id']);
        else
            $res[$arr['task_id']][$k] = $v;
    }
}

print_r($res);

<强>输出:

Array
(
    [1] => Array
        (
            [task_id] => 1
            [name] => do dishes
            [user] => Array
                (
                    [0] => bob
                    [1] => liam
                )

        )

    [2] => Array
        (
            [task_id] => 2
            [name] => vacuum
            [user] => liam
        )

    [3] => Array
        (
            [task_id] => 3
            [name] => Take out thrash
            [user] => Array
                (
                    [0] => liam
                    [1] => bob
                )

        )

)

<强>演示:
http://3v4l.org/2E9nP

答案 1 :(得分:0)

假设您的数据位于$results内; 首先创建一个函数,它将检查新结果数组中的任务ID。如果存在则返回索引,否则返回flase

function get_index($array,$task_id)
{
    foreach($array as $index=>$a)
    {
        if($a['task_id']==$task_id)
        {
            return $index;
        }
    }
    return false;
}

现在编写以下代码,以便在$ new_result

中获得所需的结果
$new_result=array();//this will contains your desired result
foreach($results as $key=>$result)
{
    $index=get_index($new_result,$result['task_id']);

    if($index===false)
    {
        $new_result[]=array('task_id'=>$result['task_id'],'name'=>$result['name'],'users'=>array($result['user']));
    }
    else
    {
        $new_result[$index]['users'][]=$result['user'];
    }
}
print_r($new_result);//this will output your desired result.

答案 2 :(得分:0)

我没有你的模型,但我怎么看,你可以使用group_concat

型号:

$this->db->select('t.id_task, t.name, GROUP_CONCAT(u.name SEPARATOR "-") as users') 
         ->from('tasks t')
         ->join('users_task ut', 't.id_task = ut.id_taks')
         ->join('user u', 'u.id_user = ut.id_user')
         ->group_by(t.id_task);
$query = $this->db->get(); 
return $query->result();

/*Result expected :
 Array
(
[1] => Array
    (
        [task_id] => 1
        [name] => do dishes
        [users] => "John-Peter"

    )

[2] => Array
    (
        [task_id] => 2
        [name] => vacuum
        [users] => "Mary-Bob"
    )
) */

之后,一个简单的爆炸应该在你的控制器中完成。

控制器:

$tasks = $this->my_model->getTasks();
foreach($tasks as $t)
{
    $t->users = explode("-", $t->users);
}