在php中的foreach循环中更改关联数组的$ key

时间:2014-07-31 20:43:21

标签: php arrays foreach key associative-array

我有一个这样的数组:

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要求键以大写字母开头...但是,我不希望将对象的变量名的第一个字母大写。傻,我知道,但我们都回答某人,而且有人想要这样。

6 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:9)

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

$array = array_combine(array_map('ucfirst', array_keys($array)), $array);
  1. 使用array_keys
  2. 获取密钥
  3. 使用ucfirst
  4. array_map应用于密钥
  5. 使用array_combine
  6. 将新密钥与值结合使用

答案 2 :(得分:2)

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

您首先要做一些检查:

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”语句与“或”组合。

答案 3 :(得分:1)

这可能有效:

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

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

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

但最后,它归结为你不能“重命名”一个键的事实。您可以创建一个新的并删除原始文件,但是您无法就地修改密钥,因为密钥 IS 是在aray中查找条目的键。更改密钥的值必然会改变密钥指向的内容。

答案 4 :(得分:1)

我的头脑......

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

略微改变你的思维方式。而不是修改现有元素,创建一个新元素,并删除旧元素。

答案 5 :(得分:0)

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

>>> collect($array)
        ->keys()
        ->map(function ($key) {
            return ucfirst($key);
        })
        ->combine($array);

=> Illuminate\Support\Collection {#1389
     all: [
       "FirstName" => "Joe",
       "LastName" => "Smith",
     ],
   }