Codeigniter 在数据库结果中生成数组
Codeigniter producing array inside database result
首先,我尝试在互联网上搜索解决方案。但我真的不知道要搜索什么,因为我没有合适的词。也许有人可以指出我已经给出的答案。
这是我的 "problem":
我的数据库中有 3 个 table:用户、任务、user_task。
用户当然包含用户。任务包含任务。而 user_task 是一个关系 table。它包含任务的 ID 和用户的 ID。 (一个任务可以有多个用户,这就是我这样做的原因。)
我想做的事情很简单。我想获取所有任务的列表以及用户分配给它的每个任务。
像这样:
任务id:1,名称:do dishes,用户:bob, liam.
就我而言,如果分配了 2 个用户,我只需要打印两次任务。到目前为止,我使用 mysql 查询。不是很 CI 具体。
查询 returns 一个 result() 有 2 行,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 and/or MySQL?
以内
希望大家能帮助我,如果我有点不清楚,请随时询问一些规格。
正如我所说:如果任何地方已经有答案,请指出我!
提前致谢!
干杯。
否,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
)
)
)
假设您的数据包含在 $results
;
首先创建一个函数,它将检查新结果中已经存在的任务 ID array.if 存在 return 索引 else return 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);
}
首先,我尝试在互联网上搜索解决方案。但我真的不知道要搜索什么,因为我没有合适的词。也许有人可以指出我已经给出的答案。
这是我的 "problem":
我的数据库中有 3 个 table:用户、任务、user_task。
用户当然包含用户。任务包含任务。而 user_task 是一个关系 table。它包含任务的 ID 和用户的 ID。 (一个任务可以有多个用户,这就是我这样做的原因。)
我想做的事情很简单。我想获取所有任务的列表以及用户分配给它的每个任务。
像这样: 任务id:1,名称:do dishes,用户:bob, liam.
就我而言,如果分配了 2 个用户,我只需要打印两次任务。到目前为止,我使用 mysql 查询。不是很 CI 具体。
查询 returns 一个 result() 有 2 行,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 and/or MySQL?
以内希望大家能帮助我,如果我有点不清楚,请随时询问一些规格。 正如我所说:如果任何地方已经有答案,请指出我!
提前致谢!
干杯。
否,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
)
)
)
假设您的数据包含在 $results
;
首先创建一个函数,它将检查新结果中已经存在的任务 ID array.if 存在 return 索引 else return 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);
}