tigroid3
@tigroid3
PHP, YII2, SQL, Postgres, Docker, SPHINX, GIT

Как группировать массив по имени?

Array
(
    [0] => Array
        (
            [name] => Холопова Анастасия
            [num_meet1] => 4
        )

    [1] => Array
        (
            [name] => Погарченкова Мария
            [num_meet1] => 2
        )

    [2] => Array
        (
            [name] => Индутова Валерия
            [num_meet1] => 1
        )

    [3] => Array
        (
            [name] => Валерьянова Саша
            [num_meet2] => 1
        )

    [4] => Array
        (
            [name] => Валерьянова Саша
            [num_meet3] => 1
        )

    [5] => Array
        (
            [name] => Холопова Анастасия
            [num_meet4] => 1
        )

)


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

[0] => Array (
            [name] => Холопова Анастасия
            [num_meet1] => 4
            [num_meet2] => 
            [num_meet3] => 
            [num_meet4] => 1
            [num_meet5] => 
            [num_meet6] => 
      )

[1] => Array
        (
            [name] => Валерьянова Саша
            [num_meet1] => 
            [num_meet2] => 1
            [num_meet3] => 1
            [num_meet4] => 
            [num_meet5] => 
            [num_meet6] => 
        )
)


num_meet1 - это количество встреч за текущий месяц месяц, и так за пол года num_meet1-num_meet6
Я нашёл несколько вариантов тут, но там определённое количество в элементе массива, а здесь могут быть разные
  • Вопрос задан
  • 313 просмотров
Решения вопроса 1
elevenelven
@elevenelven
Php Dev @ Amadeus
Простите, нет под рукой PHP. Написал с планшета.
/**
     *
     * Input array consists of elements as in example
     * <code>
     * Array
     * (
     * [0] => Array
     * (
     * [name] => Холопова Анастасия
     * [num_meet1] => 4
     * )
     *
     * [1] => Array
     * (
     * [name] => Погарченкова Мария
     * [num_meet1] => 2
     * )
     *
     * [2] => Array
     * (
     * [name] => Индутова Валерия
     * [num_meet1] => 1
     * )
     *
     * [3] => Array
     * (
     * [name] => Валерьянова Саша
     * [num_meet2] => 1
     * )
     *
     * [4] => Array
     * (
     * [name] => Валерьянова Саша
     * [num_meet3] => 1
     * )
     *
     * [5] => Array
     * (
     * [name] => Холопова Анастасия
     * [num_meet4] => 1
     * )
     *
     * )
     * </code>
     *
     * @param array $array
     *
     * @return array
     */
    function alterArray(array $array){

      $newArray = [];
      foreach($array as $subarray)
      {
        if(isset($subarray['name']))
        {
          $lastElementOfArray = array_slice($subarray, 1, 1);
          reset($lastElementOfArray);
          $newArray[ $subarray['name'] ][ key($lastElementOfArray) ] = current($lastElementOfArray);
        }
      }
      return $newArray;
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
dohlik
@dohlik
array_combine(
    array_map($array, function($a) {return $a['name'];}), 
    $array
);


array_combine() создает массив из переданных аргументов (первый - массив ключей, второй - значения). для извлечения ключей используем array_map.

Естественно, это ооочень упрощенный вариант, основанный на предположении, что всегда есть ключ name, а значения в нем уникальны.
Ответ написан
LittleFatNinja
@LittleFatNinja
горе девелопер, любитель лютой садомии
просто пройдись foreach ем, если встречается повтор то добавляешь в существующий, а этот удаляешь
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы