Как получить дублированные элементы в массиве и выбрать один из них для представления в новом массиве в laravel

Я создаю настраиваемую систему разрешений для разных разделов приложения Laravel. У меня есть массив массивов, и, возможно, есть дублирование значения section_id, но с другим значением permission. например у меня section_id => 10 существует 3 раза здесь с разными 3 permission.

[
    0 => array:2 [▼
      "section_id" => 10
      "permission" => "B"
    ]
    1 => array:2 [▼
      "section_id" => 22
      "permission" => "A"
    ]
    2 => array:2 [▼
      "section_id" => 10
      "permission" => "A"
    ]
    3 => array:2 [▼
      "section_id" => 13
      "permission" => "B"
    ]
    4 => array:2 [▼
      "section_id" => 18
      "permission" => "B"
    ]
    5 => array:2 [▼
      "section_id" => 10
      "permission" => "C"
    ]
]

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

A, B и C - это уровни разрешений, поэтому приоритет для A, затем B, затем C для того же раздела, конечный результат должен быть таким

[    
    0 => array:2 [▼
      "section_id" => 10
      "permission" => "A"
    ]
    1 => array:2 [▼
      "section_id" => 22
      "permission" => "A"
    ]
    2 => array:2 [▼
      "section_id" => 13
      "permission" => "B"
    ]
    3 => array:2 [▼
      "section_id" => 18
      "permission" => "B"
    ]
]

Вы, возможно, генерируете это как результат своей базы данных и моделей через какой-то контроллер. Лучше достичь желаемого на этом уровне до этого результата. Пожалуйста, поделитесь структурой базы данных, моделями и кодом контроллера.

Elisha Senoo 25.10.2018 11:01

@ElishaSenoo мне будет непросто добиться этого из БД, потому что это очень сложно

Abanoub Samaan 25.10.2018 11:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
34
2

Ответы 2

Вы можете использовать коллекции с помощью цепочек sortBy (), unique () и values ​​() следующим образом:

public function test() {
    $p = [
        [
            'section_id' => 10,
            'permission' => 'B'
        ],
        [
            'section_id' => 22,
            'permission' => 'A'
        ],
        [
            'section_id' => 10,
            'permission' => 'A'
        ],
        [
            'section_id' => 13,
            'permission' => 'B'
        ],
        [
            'section_id' => 18,
            'permission' => 'B'
        ],
        [
            'section_id' => 10,
            'permission' => 'C'
        ],
    ];

    $collection = collect($p);
    $sorted = $collection->sortBy(function ($product, $key) {
        return ord($product['permission']);
    })->unique('section_id')->values()->all();
    dd($p, $sorted);
}

Выходы

    array:6 [▼
      0 => array:2 [▼
        "section_id" => 10
        "permission" => "B"
      ]
      1 => array:2 [▼
        "section_id" => 22
        "permission" => "A"
      ]
      2 => array:2 [▼
        "section_id" => 10
        "permission" => "A"
      ]
      3 => array:2 [▼
        "section_id" => 13
        "permission" => "B"
      ]
      4 => array:2 [▼
        "section_id" => 18
        "permission" => "B"
      ]
      5 => array:2 [▼
        "section_id" => 10
        "permission" => "C"
      ]
    ]
    array:4 [▼
      0 => array:2 [▼
        "section_id" => 22
        "permission" => "A"
      ]
      1 => array:2 [▼
        "section_id" => 10
        "permission" => "A"
      ]
      2 => array:2 [▼
        "section_id" => 13
        "permission" => "B"
      ]
      3 => array:2 [▼
        "section_id" => 18
        "permission" => "B"
      ]
    ]

что, если я хочу сортировать по разрешению B, а также что, если есть только B, C, и я хочу получить C

Abanoub Samaan 25.10.2018 11:25

Попробуй это:

$myArray = array( 
   ["section_id" => 10, "permission" => "B"],
   ["section_id" => 22, "permission" => "A"],
   ["section_id" => 10, "permission" => "A"],
   ["section_id" => 13, "permission" => "B"],
   ["section_id" => 18, "permission" => "B"],
   ["section_id" => 10, "permission" => "C"]);

$sectionArr  = array_column($myArray, 'section_id');
$permissionArr = array_column($myArray, 'permission');

array_multisort($sectionArr, SORT_ASC, $permissionArr, SORT_ASC, $myArray);
$newArray = array();
$tempSection = array();
foreach($myArray as $key => $singleArray){
  if (!in_array($singleArray['section_id'], $tempSection)){
      $tempSection[] = $singleArray['section_id'];
      $newArray[] = ["section_id" => $singleArray['section_id'], "permission" => $singleArray['permission']];
    }
}

print_r($newArray);

Другие вопросы по теме