Объединить два (или более) массива и сохранить самые высокие значения?

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

| username  | passwd | email         | groups         |
| test_user | 9agb9  | [email protected] | 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, но он сохраняет значение в зависимости от порядка переменных, указанных в функции.


person rage8885    schedule 12.07.2010    source источник


Ответы (3)


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

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')
person NikiC    schedule 12.07.2010

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

person Stephen    schedule 12.07.2010

Недавно пришлось сделать что-то подобное в 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];
    }
  }

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

person geerlingguy    schedule 25.08.2011