Объединить два (или более) массива и сохранить значения, которые являются самыми высокими? - PullRequest
0 голосов
/ 12 июля 2010

У меня есть настройки на основе разрешений / групп, на которых я пытаюсь объединить результаты.Например, пользователь может быть связан с четырьмя группами:

| username  | passwd | email         | groups         |
| test_user | 9agb9  | test@test.com | g1, g2, g3, g4 |

таблица группировки:

| group | perm1 | perm2 | perm3 | perm4 | perm5 | perm5 | perm7 |
| g1    | 1     | 0     | 0     | 0     | 1     | 0     | 2     |
| g2    | 0     | 0     | 0     | 1     | 0     | 0     | 0     |
| g3    | 0     | 1     | 0     | 0     | 2     | 0     | 0     |
| g4    | 0     | 0     | 0     | 0     | 1     | 1     | 0     |

Я собираюсь взять результаты этих четырех строк (сохраненных в виде массиваиз запроса к БД) и объединить их в один массив, который будет выглядеть следующим образом:

| group    | perm1 | perm2 | perm3 | perm4 | perm5 | perm5 | perm7 |
| combined | 1     | 1     | 0     | 1     | 2     | 1     | 2     |

Самое высокое значение из каждого массива становится значением в объединенном массиве.Если 1 из 100 записей равен «2», а остальные - «1» или «0», то мне нужно, чтобы в результате было «2».

Я посмотрел на array_merge, но этосохраняет значение в зависимости от порядка переменных, указанных в функции.

Ответы [ 3 ]

2 голосов
/ 12 июля 2010

Может быть, вы хотите, чтобы это уже обрабатывалось БД:

SELECT MAX(perm1), MAX(perm2), MAX(perm3), MAX(perm4), MAX(perm5), MAX(perm6), MAX(perm7)
FROM group_perm_linking_table
WHERE group IN ('gr1', 'gr2', 'gr3', 'gr4')
0 голосов
/ 26 августа 2011

Пришлось недавно сделать что-то подобное в PHP:

  $new_array = array();
  foreach ($array_second as $key => $value) {
    if ($array_first[$key] > $array_second[$key]) {
      $new_array[$key] = $array_first[$key];
    }
    else {
      $new_array[$key] = $array_second[$key];
    }
  }

Конечно, это можно записать немного проще, и вы можете использовать троичный оператор для его сокращения, но этот подробный дисплей показывает, как вы можете сделать это более семантически. Это относительно быстро, и я использую его, чтобы без проблем объединить несколько сотен настроек аккаунта.

0 голосов
/ 12 июля 2010

Вам нужно будет создать новый мастер-массив, затем перебрать ваши дочерние массивы и обновлять мастер только тогда, когда child['value'] > master['value']

...