PHP обратный для array_diff_assoc(), удалить повторяющиеся значения
У меня есть система уровней разрешений, поэтому мне нужно удалить из массива мои предыдущие выбранные разрешения. Например:
My permissions: read, write
All permissions: read, write, update, delete
I need return: update, delete
Эта проблема: array_diff_assoc
() сравнивать точные ключи, [0] = [0], мне нужно сравнивать значения, а не ключи, и возвращать все разрешения без моих предыдущих выбранных разрешений, а не удаленных значений.
res['all_withou_pre_selected_permissions'] = array_diff_assoc($all_permissions,$res['my_permissions']);
print_r($res['all_withou_pre_selected_permissions']);
Мои массивы и возврат
My permissions
array(2) {
[0]=>
array(6) {
["Modulo"]=>
string(15) "Administradores"
[0]=>
string(15) "Administradores"
["Tipo"]=>
string(9) "Adicionar"
[1]=>
string(9) "Adicionar"
["Nome"]=>
string(3) "kin"
[2]=>
string(3) "kin"
}
[1]=>
array(6) {
["Modulo"]=>
string(15) "Administradores"
[0]=>
string(15) "Administradores"
["Tipo"]=>
string(7) "Excluir"
[1]=>
string(7) "Excluir"
["Nome"]=>
string(3) "kin"
[2]=>
string(3) "kin"
}
}
All Permissions
array(8) {
[0]=>
array(4) {
["Modulo"]=>
string(15) "Administradores"
[0]=>
string(15) "Administradores"
["Tipo"]=>
string(9) "Adicionar"
[1]=>
string(9) "Adicionar"
}
[1]=>
array(4) {
["Modulo"]=>
string(15) "Administradores"
[0]=>
string(15) "Administradores"
["Tipo"]=>
string(6) "Editar"
[1]=>
string(6) "Editar"
}
[2]=>
array(4) {
["Modulo"]=>
string(15) "Administradores"
[0]=>
string(15) "Administradores"
["Tipo"]=>
string(7) "Excluir"
[1]=>
string(7) "Excluir"
}
[3]=>
array(4) {
["Modulo"]=>
string(15) "Administradores"
[0]=>
string(15) "Administradores"
["Tipo"]=>
string(3) "Ler"
[1]=>
string(3) "Ler"
}
Return of PHP code
array(6) {
[2]=>
array(4) {
["Modulo"]=>
string(15) "Administradores"
[0]=>
string(15) "Administradores"
["Tipo"]=>
string(7) "Excluir"
[1]=>
string(7) "Excluir"
}
[3]=>
array(4) {
["Modulo"]=>
string(15) "Administradores"
[0]=>
string(15) "Administradores"
["Tipo"]=>
string(3) "Ler"
[1]=>
string(3) "Ler"
}
2 ответа
Есть ли причина, по которой вы не можете использовать array_diff
?
$my = array( 'read', 'write');
$all = array( 'read', 'write', 'update', 'delete');
var_dump( array_diff( $all, $my));
Выход:
array(2) {
[2]=>
string(6) "update"
[3]=>
string(6) "delete"
}
Объединение двух массивов:
$union = array_unique( array_merge( $arr1, $arr2 ) );
Пересечение их:
$intersect = array_intersect( $arr1, $arr2 );
Разница:
$diff = array_diff( $arr1, $arr2 );
Источник симметричной разности:
$sym_diff = array_merge( array_diff( $arr1, $arr2 ), array_diff( $arr2, $arr1 ) );
Другой возможностью было бы написать простой FilterIterator
,
Поскольку в выдаче Google не было других вопросов, я оставляю ответ на этот старый вопрос.