PHP:更新数组的最有效方法,该数组具有与变量相对应的键。名

时间:2014-07-21 20:51:08

标签: php arrays

可以请任何人在寻找处理用户输入(来自帖子)的方法方面提供一些帮助,该方法作为变量(显然)以及变量'名称与从数据库阵列的中提取的对应。

我问这个问题是为了不仅仅是一个解决方案,而是最好的(最简洁的)可能的例子。

目前,我可以使用loops if/elseimplode/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] => 
)

有谁可以帮助找到最佳和最简洁的解决方案来获得预期的数组

1 个答案:

答案 0 :(得分:3)

使用匿名函数的解决方案的问题是您无法访问变量。我创建了两个解决方案来证明这个案例:

版本1已被Illis请求删除,请参阅帖子历史:)

版本2.作为数组输入,使用可以轻松地将它们传递给匿名函数。详细了解closuresarray_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);