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

时间:2018-03-17 11:48:59

标签: php arrays multidimensional-array reference unset

我想创建一个接受路径参数的函数,并返回多维数组的适当成员。让我们说我们这样做:

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

我希望能够做几件事:

  • 修改
  • 删除/取消设置

1 个答案:

答案 0 :(得分:1)

我花了更多的时间,而不是我应该抓住我的愚蠢头,所以我虽然分享它,以防有人可能遇到类似的问题。我会非常具有描述性,所以像我这样的初学者能够理解一切。我想。

首先,让我们就地址格式达成一致:

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分配了一个新值,它只会更改该变量,而不会更改源数组({{1} })。通过引用使用PHP分配很容易避免;

$myContactsBook

但是,像这样我们仍然无法取消数组成员的设置。如果我们现在在$ lookup上使用function editContacts(array $address, $newValue) { $lookup =& $myContactsBook; foreach ($address as $key) { $lookup =& $lookup[$key]; } $lookup = $newValue; return; } 构造,它将取消设置引用,但$ myContactsBook将保持不变。我们可以执行unset()之类的操作,但不会删除数组键。根据您的需要,这可能还不够。

我们需要的是$lookup = null。我们可以通过这样做尽可能接近:

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

这基本上是代码的第一个片段。如果有更好的解决方案或有些不明确的地方,请告诉我。

也就是说,如果有人在一开始就需要帮助那么简单。