Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何设置依赖于键名的数组值_Php_Arrays - Fatal编程技术网

Php 如何设置依赖于键名的数组值

Php 如何设置依赖于键名的数组值,php,arrays,Php,Arrays,我对PHP有点陌生,所以问题可能很明显,但是 是否可以创建一个数组,并使用wierd示例中的键名分配其值 $arr = array ( "foo" => $this_key_name." some text added", "bar" => $this_key_name." some text added", "foobar" => "this is left unchanged", ) 当然,我所说的$this_key_name是指一些包含键的“想象

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

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

$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”和“bar”的键,这真的没有什么问题。但是如果说他们的数量超过20,他们就不会那么短了。复制粘贴这样的模板值要比重新键入每个模板值容易得多,是吗

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


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

一个词的答案是

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

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'];

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

在PHP中无法做到这一点,因为在您尝试读取
此\u key\u 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);
});

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

$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';
}

在这种情况下,使用替换的字符串模式是我能想到的最好的解决方案。另外,它是检查真/假条件是否更改值的一个很好的旁路。非常感谢。