【问题标题】:How to set the array values that depend on their key names如何设置取决于其键名的数组值
【发布时间】:2014-04-30 22:06:01
【问题描述】:

我对 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”和“bar”的键,这真的不会造成麻烦。但是说他们的数量在20个以上,他们并没有那么短。复制粘贴这样的模板值比重新输入每个值要容易得多,嗯?

将它们留空并在之后设置值的想法,循环通过foreach() 似乎没问题,但需要额外检查是否应该处理每个元素。

所以问题是:是否存在任何包含当前数组键名的属性,可以在值分配期间访问?

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    在 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);
    });
    

    【讨论】:

    • 在这种情况下,使用替换字符串模式是我能想象到的最佳解决方案。这也是一个很好的绕过检查真/假条件是否更改值的方法。谢谢。
    【解决方案2】:

    一个字的答案是

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        您最简单的解决方案可能是——您可能已经猜到了——构建数组,然后循环进行分配。

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

        【讨论】:

          猜你喜欢
          • 2021-12-28
          • 1970-01-01
          • 2021-06-19
          • 1970-01-01
          • 2020-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多