代码点火器在数据库结果中生成数组


Codeigniter producing array inside database result

首先,我尝试在互联网上搜索解决方案。但我真的不知道该搜索什么,因为我没有合适的单词。也许有人可以给我一个已经给出的答案。

这就是我的"问题":

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

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

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

类似于以下内容:任务id:1,名称:洗碗,用户:bob,liam。

到目前为止,如果有两个用户被分配给一个任务,我只需要打印两次。不是专门针对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"
           }
}

我想要得到的是一个结果,其中有一行包含任务,在那一行中,我想要一个数组,其中每个用户的名字都分配给它

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中?

我希望你们能帮助我,如果我有点不清楚,请随时询问一些规格。正如我所说:如果任何地方都已经有答案了,请给我指一下!

提前感谢!

干杯。

,CI活动记录中没有任何选项可以实现这一点
你必须循环你的结果。

<?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

假设您的数据位于$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.

我没有你的模型,但我认为,你可以使用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);
}