在PHP中将值从一个数组连接到另一个数组

时间:2012-03-30 14:23:54

标签: php sql codeigniter

我有一个主数组,它是来自用户表的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

4 个答案:

答案 0 :(得分:2)

你最好不要在SQL中进行繁重的工作,而不是在PHP中。

所以,如果你的用户表是这样的:

enter image description here

...你的群组表格是这样的:

enter image description here

...而您的users_groups表格如下:

enter image description here

...然后您可以使用以下查询:

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;

...产生这个输出:

enter image description here

感谢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'];
        }
    }
}   

空括号[]附加到数组