【问题标题】:Change $key of associative array in a foreach loop in php在php的foreach循环中更改关联数组的$key
【发布时间】:2014-09-23 23:15:20
【问题描述】:

我有一个这样的数组:

array(
    'firstName' => 'Joe',
    'lastName'  => 'Smith'
    )

我需要遍历数组中的每个元素,最后,数组应该如下所示:

array(
    'FirstName' => 'Joe',
    'LastName'  => 'Smith'
    )

失败的想法是:

    foreach($array as $key => $value)
    {
        $key = ucfirst($key);
    }

这显然行不通,因为数组不是通过引用传递的。然而,所有这些尝试也都失败了:

    foreach(&$array as $key => $value)
    {
        $key = ucfirst($key);
    }


    foreach($array as &$key => $value)
    {
        $key = ucfirst($key);
    }

我的智慧几乎以这个结束。我正在使用 Magento 1.9.0.1 CE,但这与这个问题无关。如果您必须知道,我必须这样做的原因是因为我有一堆对象,我将它们作为数组返回,以组装到 SOAP 客户端中。我正在使用的 API 要求密钥以大写字母开头……但是,我不希望将对象变量名的第一个字母大写。很傻,我知道,但我们都对某个人负责,并且有人想要那样做。

【问题讨论】:

    标签: php arrays foreach key associative-array


    【解决方案1】:

    unset首先是它,以防它已经是正确的格式,否则你将删除你刚刚定义的内容:

    foreach($array as $key => $value)
        {
            unset($array[$key]);
            $array[ucfirst($key)] = $value;
        }
    

    【讨论】:

    • 如果键的第一个字母已经大写,这不就是从数组中完全删除该条目吗?应该是unset 然后赋值吧?
    • @Tim 这正是我所想的,果然这就是发生的事情。最好加上“if (ucfirst($key)==$key) continue;”作为循环中的第一行。
    【解决方案2】:

    您无法修改foreach 中的密钥,因此您需要取消设置旧密钥并创建一个新密钥。这是另一种方式:

    $array = array_combine(array_map('ucfirst', array_keys($array)), $array);
    
    1. 使用array_keys获取密钥
    2. 使用array_mapucfirst 应用于键
    3. 使用array_combine 将新键与值组合起来

    【讨论】:

      【解决方案3】:

      这里的答案很危险,如果键没有改变,元素实际上是从数组中删除的。此外,您可能会在不知不觉中覆盖已经存在的元素。

      你需要先做一些检查:

      foreach($array as $key => $value)
      {
          $newKey = ucfirst($key);
      
          // does this key already exist in the array?
          if(isset($array[$newKey])){
              // yes, skip this to avoid overwritting an array element!
              continue;
          }
      
          // Is the new key different from the old key?
          if($key === $newKey){
              // no, skip this since the key was already what we wanted.
              continue;
          }
      
          $array[$newKey] = $value;
          unset($array[$key]);
      }
      

      当然,如果您不需要以不同方式处理这些情况,您可能希望将这些“if”语句与“or”结合起来。

      【讨论】:

        【解决方案4】:

        这可能有效:

        foreach($array as $key => $value) {
             $newkey = ucfirst($key);
             $array[$newkey] = $value;
             unset($array[$key]);
        }
        

        但是在循环时修改这样的数组是非常危险的。您最好将不可设置的键存储在另一个数组中,然后有一个单独的循环将它们从原始数组中删除。

        当然,这不会检查数组中可能的碰撞,例如firstname -> FirstName,其中 FirstName 已存在于数组中的其他位置。

        但归根结底,归根结底是您无法“重命名”密钥。您可以创建一个新的并删除原始的,但您不能就地修改键,因为键 IS 是在数组中查找条目的键。更改键的值必然会更改该键所指向的内容。

        【讨论】:

          【解决方案5】:

          我的头顶......

          foreach($array as $key => $value){
              $newKey = ucfirst($key);
              $array[$newKey] = $value;
              unset($array[$key]);
          }
          

          稍微改变一下你的思维方式。与其修改现有元素,不如创建一个新元素并删除旧元素。

          【讨论】:

            【解决方案6】:

            如果您使用 laravel 或在依赖项中的某处有 Illuminate\Support,这是一种可链接的方式:

            >>> collect($array)
                    ->keys()
                    ->map(function ($key) {
                        return ucfirst($key);
                    })
                    ->combine($array);
            
            => Illuminate\Support\Collection {#1389
                 all: [
                   "FirstName" => "Joe",
                   "LastName" => "Smith",
                 ],
               }
            

            【讨论】:

              猜你喜欢
              • 2013-08-02
              • 2023-03-26
              • 1970-01-01
              • 2023-02-05
              • 1970-01-01
              • 1970-01-01
              • 2011-08-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多