我有一个这样的数组:
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要求键以大写字母开头...但是,我不希望将对象的变量名的第一个字母大写。傻,我知道,但我们都回答某人,而且有人想要这样。
答案 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);
array_keys
ucfirst
array_map
应用于密钥
array_combine
答案 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",
],
}