如何设置取决于其键名称的数组值


How to set the array values that depend on their key names

我对PHP有点陌生,所以这个问题可能很明显,但。。

是否可以创建一个数组并使用键的名称分配其值,如下面的示例中所示

$arr = array (
    "foo" => $this_key_name." some text added",
    "bar" => $this_key_name." some text added",
    "foobar" => "this is left unchanged",
)

当然,我所说的$this_key_name是指一些"想象和期望的属性",它包含密钥,即表示密钥的字符串。

只有几个类似于"foo"answers"bar"的键,这真的不会造成麻烦。但假设它们的数量在20以上,它们就不那么短了。复制粘贴这些模板化的值会比重新键入每个值容易得多,嗯?

将它们留空并在之后设置值,循环通过foreach()的想法似乎可以,但如果不是每个元素都应该处理,则需要额外的检查。

因此,问题是:是否存在任何包含当前数组键名的属性,这些属性可以在值的赋值过程中访问

在PHP中无法做到这一点,因为数组键实际上并不是在您尝试读取this_key_name时创建的。相反,我会选择foreach循环,它仍然相对简单。

$arr = array(
    "foo" => '$this_key_name some text added'
);
array_walk($arr, function (&$value, $key) {
    $value = str_replace('$this_key_name', $key, $value);
});

一个字的答案是

您可以使用一些占位符,然后替换它,或者使用辅助函数,例如:

function makeItems(array $keys, $valueFormat)
{
    $result = [];
    foreach ($keys as $key) {
        $result[$key] = sprintf($valueFormat, $key);
    }
    return $result;
}

现在您可以使用获得所需的结果

$arr = makeItems(["foo", "bar"], "%s some text added") +
       ['foobar' => 'this is left unchanged'];

当然,走这条路意味着你不能再静态地初始化数组(例如,在声明类属性时这将不起作用(,但即使有一些内置机制可以帮助你,你也会有同样的缺点。

您可以使用变量作为键名称,但不能引用键名称。像这样:

$name1 = 'foo';
$name2 = 'bar';
$name3 = 'baz';
$array = array(
    $name1 => $name1.'string 1',
    $name2 => $name2.'string 2',
    $name3 => $name3
);

没有内置属性可以在分配时反映键名。

最简单的解决方案可能是——正如您可能已经猜到的那样——构建数组,然后循环进行赋值。

foreach($arr as $key => $value) {
    $arr[$key] = $key . ' some text added';
}