Я создаю настраиваемую систему разрешений для разных разделов приложения 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"
]
]
@ElishaSenoo мне будет непросто добиться этого из БД, потому что это очень сложно






Вы можете использовать коллекции с помощью цепочек 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
Попробуй это:
$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);
Вы, возможно, генерируете это как результат своей базы данных и моделей через какой-то контроллер. Лучше достичь желаемого на этом уровне до этого результата. Пожалуйста, поделитесь структурой базы данных, моделями и кодом контроллера.