PHP - 通过给定地址修改第 n 个维度的数组成员

PHP - Modify array member of an n'th dimension by given address

我想创建一个接受路径参数和 returns 多维数组的适当成员的函数。假设我们有这个:

$myContactsBook = [
    'relatives' => [
        'bob',
        'john',
    ],
    'friends' => [
        'work' => [
            'andrew',
            'eric',
        ],
        'mars' => [
            'zoopzap'
        ],
    ],
];

我希望能够做几件事:

我花在这上面的时间比我应该挠头的时间还多,所以我还是会分享它,以防有人遇到类似的问题。我将非常详细地描述,以便像我这样的初学者能够理解所有内容。我想。

首先,让我们约定好地址格式:

readContact('path/to/target')

这使用起来最简单,但如果我们的数组键中有正斜杠,则可能会出现问题;它也无法区分数字索引和数字字符串。

readContacts(['path', 'to', 'target'])

这是万无一失的,但有点丑。

如果您确定您的密钥将是什么样子,您可以使用字符串地址并使用 / 分隔符或您选择的任何分隔符展开它。无论如何你都会得到一个数组,所以我假设我们为了这个例子使用数组参数:

function unsetContacts(array $address) {
    $lookup =& $myContactsBook;
    $lastKey = array_pop($address);
    foreach ($address as $key) {
        $lookup =& $lookup[$key];
    }
    // if you want to also return the value and make this getAndUnsetContacts();
    // $return = $lookup[$last_bit];
    unset($lookup[$last_bit]);
    // return $return;
}

如您所见,如果我们只想读取数组值,我们可以这样做:

function readContacts(array $address) {
    $lookup = $myContactsBook;
    foreach ($address as $key) {
        $lookup = $lookup[$key];
    }
    return $lookup;
}

如果您想编辑值,这将不起作用,因为如果我们现在为 $lookup 分配一个新值,它只会更改该变量,但不会更改源数组($myContactsBook).使用 PHP 的引用赋值很容易避免这种情况;

function editContacts(array $address, $newValue) {
    $lookup =& $myContactsBook;
    foreach ($address as $key) {
        $lookup =& $lookup[$key];
    }
    $lookup = $newValue;
    return;
}

但是,这样我们仍然无法取消设置数组成员。如果我们现在在 $lookup 上使用 unset() 构造,它将取消设置引用,但 $myContactsBook 将保持不变。我们可以做类似 $lookup = null 的事情,但它不会删除数组键。根据您的需要,这可能还不够。

我们需要的是,unset($myContactsBook['path']['to']['target']);。我们可以通过这样做尽可能接近它:

$lookup =& $myContactsBook['path']['to'];
unset(lookup['target']);

这基本上就是第一段代码所做的。如果有更好的解决方案或不清楚的地方,请告诉我。

也就是说,如果有人首先需要帮助处理如此简单的事情。