Объединение значений из одного массива в другой в PHP - PullRequest
1 голос
/ 30 марта 2012

У меня есть один основной массив, который является возвращенными данными из запроса 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-й ключ в первом массиве, что-то вроде:

["groups"] => ...

, который я могу заполнить идентификаторами групп, в которых каждый пользователь принимает участие и в конце которых выглядитчто-то вроде этого:

["groups"] => "1,2,3,4"

Другими словами, поскольку отношение много ко многим,Пользователь может участвовать в более чем одной группе, когда я нажимаю новое значение. Я не хочу создавать новый ключ со значением, а вместо этого объединить существующие значения ключа с новым идентификатором.

Пока что яесть что-то вроде этого:

$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']);

                }

              } 

}

Но я не работаю.Я попробовал несколько других вещей, но пока ничего.

Спасибо, Лерон

Ответы [ 4 ]

2 голосов
/ 30 марта 2012

Возможно, вам лучше выполнять тяжелую работу в 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

Благодарю в этом посте за информацию о том, как создавать значения через запятую из SQL, и за комментарий об использовании CAST AS CHAR.

1 голос
/ 30 марта 2012

Как и сейчас, вы передаете клонированное значение, а не ссылку в foreach.Если вы запускаете foreach ($ array как $ value), $ value является копией.Вы должны запустить его как foreach (массив $ как & $ value), чтобы фактически отредактировать значение $. & означает, что вы передаете аргумент в качестве ссылки, а не просто клонируете его.

Позвольте мне продемонстрировать простой пример.

1 голос
/ 30 марта 2012

Это усложняет вашу жизнь и делает данные менее полезными, чтобы попытаться создать строку через запятую.Имеет гораздо больше смысла создавать подмассив значений, который вы можете 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);
0 голосов
/ 30 марта 2012

Ты рядом!

Попытка:

foreach($query as $key=>$value ) {
    foreach($results as $row) {
        if( $value['id'] == $row['user_id'] ) {
            $query[$key]['groups'][] = $row['group_id'];
        }
    }
}   

Пустая скобка [] добавляется в массив

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...