Alterar $ chave da matriz associativa em um loop foreach em php

Eu tenho uma matriz como esta:

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

Eu preciso fazer um loop sobre todos os elementos da minha matriz e no final, a matriz deve ficar assim:

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

A ideia falhada era:

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

Isso, obviamente, não funcionará, porque a matriz não é passada por referência. No entanto, todas essas tentativas também falham:

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

Muito bem na minha inteligência termina com este. Estou usando o Magento 1.9.0.1 CE, mas isso é bastante irrelevante para esse problema. Se você deve saber, a razão pela qual eu tenho que fazer isso é porque eu tenho um monte de objects que estou retornando como uma matriz para ser montado em um cliente SOAP. A API que estou usando exige que as chaves comecem com uma letra maiúscula … no entanto, não quero capitalizar a primeira letra dos nomes das variables ​​do meu object. Silly, eu sei, mas todos respondemos a alguém e que alguém quer assim.

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

Você não pode modificar as chaves em um foreach , então você precisará criar um novo e descompactar o antigo. Aqui está outra maneira:

 $array = array_combine(array_map('ucfirst', array_keys($array)), $array); 
  1. Obter as chaves usando array_keys
  2. Aplicar ucfirst as chaves usando array_map
  3. Combine as novas chaves com os valores usando array_combine

Isso pode funcionar:

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

Mas é muito arriscado modificar uma matriz como esta enquanto você está fazendo um loop sobre ela. Você pode estar melhor para armazenar as chaves desajustáveis ​​em outra matriz, então tenha um loop separado para removê-las da matriz original.

E, claro, isso não verifica possíveis colisões no aray, por exemplo, firstname -> FirstName , onde FirstName já existiu em outro lugar na matriz.

Mas no final, ele se resume ao fato de que você não pode “renomear” uma chave. Você pode criar um novo e deletar o original, mas você não pode modificar a tecla, porque a chave é a chave para procurar uma input no aray. alterar o valor da chave necessariamente muda o que essa chave está apontando.

Top of my head …

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

Mude um pouco a sua maneira de pensar. Em vez de modificar um elemento existente, crie um novo e remova o antigo.