可以请任何人在寻找处理用户输入(来自帖子)的方法方面提供一些帮助,该方法作为变量(显然)以及变量'名称与从数据库阵列的键中提取的对应。
我问这个问题是为了不仅仅是一个解决方案,而是最好的(最简洁的)可能的例子。
目前,我可以使用loops
if/else
和implode/explode
来实现这一目标,但我认为有可能以更好的方式实现这一目标,例如,使用内置的 PHP 函数来同时处理使用匿名函数的数组?
代码和评论:
// User id to be processed (extracted from a post)
$id = '8ccaa11';
// Posted new (updated) settings about the user above (extracted from a post)
$individuals_read_access = false;
$individuals_write_access = false;
$calendar_read_access = false;
$calendar_write_access = true;
$documents_read_access = true
$documents_write_access = false
// Current records extracted from database
Array
(
[individuals_read_access] => 8ccaa11
[individuals_write_access] => 8ccaa11
[calendar_read_access] => 8ccaa11|00cc00aa
[calendar_write_access] => 8ccaa11
[documents_read_access] => 8ccaa11
[documents_write_access] => 8ccaa11
)
// Expected array to be posted back to database
Array
(
[individuals_read_access] =>
[individuals_write_access] =>
[calendar_read_access] => 00cc00aa
[calendar_write_access] => 8ccaa11
[documents_read_access] => 8ccaa11
[documents_write_access] =>
)
有谁可以帮助找到最佳和最简洁的解决方案来获得预期的数组?
答案 0 :(得分:3)
使用匿名函数的解决方案的问题是您无法访问变量。我创建了两个解决方案来证明这个案例:
版本1已被Illis请求删除,请参阅帖子历史:)
版本2.作为数组输入,使用可以轻松地将它们传递给匿名函数。详细了解closures和array_walk。
<?php
$id = '8ccaa11';
$inputs = [
'individuals_read_access' => false,
'individuals_write_access' => false,
'calendar_read_access' => false,
'calendar_write_access' => true,
'documents_read_access' => true,
'documents_write_access' => false
];
// Current records extracted from database
$records = [
'individuals_read_access' => '8ccaa11',
'individuals_write_access' => '8ccaa11',
'calendar_read_access' => '8ccaa11|00cc00aa',
'calendar_write_access' => '8ccaa11',
'documents_read_access' => '8ccaa11',
'documents_write_access' => '8ccaa11'
];
array_walk($records, function(&$value, $key) use ($inputs, $id) {
if (!isset($inputs[$key])) {
continue;
}
$rights = empty($value) ? [] : explode('|', $value);
$index = array_search($id, $rights);
if (!$inputs[$key] && $index !== false) {
unset($rights[$index]);
} else {
array_push($rights, $id);
}
$value = implode('|', array_unique($rights));
});
var_dump($records);