我有一个主数组,它是来自用户表的MySQL查询的返回数据,如下所示:
array(36) {
[0]=>
array(4) {
["id"]=>
string(1) "101"
["email"]=>
string(15) "kkkk@gggg.com"
["firstname"]=>
string(8) "aaaaa"
["lastname"]=>
string(12) "bbbbb"
}
[1]=>
array(4) {
["id"]=>
string(1) "102"
["email"]=>
string(17) "mmmmm@hhhhh.com"
["firstname"]=>
string(12) "vvvv"
["lastname"]=>
string(12) "zzzzz"
}
[2]=>
array(4) {
["id"]=>
string(2) "103"
["email"]=>
string(17) "eeee@gmail.com"
["firstname"]=>
string(6) "ggggg"
["lastname"]=>
string(12) "zzzzz"
依旧...... 而第二个数组又是MySQL查询,它来自一个带有两个外键的表,使得两个表的关系很多,并且看起来像这样:
array(7) {
[0]=>
array(2) {
["user_id"]=>
string(3) "101"
["group_id"]=>
string(1) "1"
}
[1]=>
array(2) {
["user_id"]=>
string(3) "102"
["group_id"]=>
string(1) "1"
}
[2]=>
array(2) {
["user_id"]=>
string(3) "103"
["group_id"]=>
string(1) "1"
}
最终目标是在第一个数组中创建第5个键,如:
[ “基团”] => ...
我可以填充每个用户参与的组的ID,最后看起来像这样:
[ “基团”] => “中1,2,3,4”
换句话说,因为关系是多对多,当我推送新值时,用户可能会参与多个组,我不想创建具有值的新键,而是要合并现有的值。使用新ID的密钥。
到目前为止,我有这样的事情:
$query = $this->mUsers->getAll(); //Main query to get users data
$results = $this->mUsers->getGroupsAndUsers(); //Query for getting the group_id and user_id
// Looping both arrays to find matching ID's
foreach($query as $key=>$value){ //$value['id'] returns the value of the users id from table users
foreach($results as $row){
if ($value['id']==$row['user_id'])
{
array_push($value,"groups",$row['group_id']);
}
}
}
但我不行。我现在尝试了一些其他的东西,但没有。
由于 Leron
答案 0 :(得分:2)
你最好不要在SQL中进行繁重的工作,而不是在PHP中。
所以,如果你的用户表是这样的:
...你的群组表格是这样的:
...而您的users_groups表格如下:
...然后您可以使用以下查询:
SELECT id,email,firstname,lastname, GROUP_CONCAT(users_groups.group_id) as groups
FROM `users`
JOIN users_groups on users.id = users_groups.user_id
GROUP BY users.id;
(或者这个,如果你在phpMyAdmin中测试的话)
SELECT id,email,firstname,lastname, GROUP_CONCAT(CAST(users_groups.group_id AS CHAR)) as groups
FROM `users`
JOIN users_groups on users.id = users_groups.user_id
GROUP BY users.id;
...产生这个输出:
感谢this post有关如何从SQL生成逗号分隔值的信息,以及有关使用CAST AS CHAR的注释。
答案 1 :(得分:1)
就像现在一样,你传递的是克隆值,而不是引用到foreach中。如果你运行foreach($ array作为$ value),$ value是一个副本。您必须将其作为foreach运行($ array为 & $ value)才能实际编辑$ value。 & 表示您将参数作为参考传递而不是仅仅克隆它。
让我用一个简单的例子来证明。
$names = array("bob", "joe", "mustafa", "ghandi");
foreach($names as $name) {
$name = "name: " . $name;
}
print_r($names);
/** prints:
Array
(
[0] => bob
[1] => joe
[2] => mustafa
[3] => ghandi
)
*/
$names = array("bob", "joe", "mustafa", "ghandi");
foreach($names as &$name) {
$name = "name: " . $name;
}
print_r($names);
/** prints:
Array
(
[0] => name: bob
[1] => name: joe
[2] => name: mustafa
[3] => name: ghandi
)
*/
答案 2 :(得分:1)
这会让您的生活变得更加困难,并且使数据变得不那么有用,尝试构建逗号分隔的字符串。创建值的子数组更有意义,如果需要字符串表示,可以implode(',', $arr)
。如果您的用户数据数组与user_id
字段具有相同的密钥,它还可以使工作更轻松,数据更有用:
// First, get the array of users and format it with sensible keys
$users = array();
foreach ($this->mUsers->getAll() as $user) $users[$user['id']] = array_merge($user, array('groups' => array()));
// Now assign group relationships
foreach ($this->mUsers->getGroupsAndUsers() as $group) {
$users[$group['user_id']]['groups'][] = $group['group_id'];
}
print_r($users);
答案 3 :(得分:0)
你很亲密!
尝试:
foreach($query as $key=>$value ) {
foreach($results as $row) {
if( $value['id'] == $row['user_id'] ) {
$query[$key]['groups'][] = $row['group_id'];
}
}
}
空括号[]
附加到数组