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'
],
],
];
我希望能够做几件事:
- 阅读
- 编辑
- Remove/unset
我花在这上面的时间比我应该挠头的时间还多,所以我还是会分享它,以防有人遇到类似的问题。我将非常详细地描述,以便像我这样的初学者能够理解所有内容。我想。
首先,让我们约定好地址格式:
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']);
这基本上就是第一段代码所做的。如果有更好的解决方案或不清楚的地方,请告诉我。
也就是说,如果有人首先需要帮助处理如此简单的事情。
我想创建一个接受路径参数和 returns 多维数组的适当成员的函数。假设我们有这个:
$myContactsBook = [
'relatives' => [
'bob',
'john',
],
'friends' => [
'work' => [
'andrew',
'eric',
],
'mars' => [
'zoopzap'
],
],
];
我希望能够做几件事:
- 阅读
- 编辑
- Remove/unset
我花在这上面的时间比我应该挠头的时间还多,所以我还是会分享它,以防有人遇到类似的问题。我将非常详细地描述,以便像我这样的初学者能够理解所有内容。我想。
首先,让我们约定好地址格式:
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']);
这基本上就是第一段代码所做的。如果有更好的解决方案或不清楚的地方,请告诉我。
也就是说,如果有人首先需要帮助处理如此简单的事情。