在php中更改foreach循环中关联数组的$key
我有这样一个数组:在php中更改foreach循环中关联数组的$key,php,arrays,foreach,key,associative-array,Php,Arrays,Foreach,Key,Associative Array,我有这样一个数组: array( 'firstName' => 'Joe', 'lastName' => 'Smith' ) array( 'FirstName' => 'Joe', 'LastName' => 'Smith' ) 我需要在数组中的每个元素上循环,最后,数组应该如下所示: array( 'firstName' => 'Joe', 'lastName' => 'Smith'
array(
'firstName' => 'Joe',
'lastName' => 'Smith'
)
array(
'FirstName' => 'Joe',
'LastName' => 'Smith'
)
我需要在数组中的每个元素上循环,最后,数组应该如下所示:
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要求键以大写字母开头……但是,我不希望将对象变量名的第一个字母大写。愚蠢,我知道,但我们都会回答某人的问题,而且有人希望这样做。您不能修改
foreach
中的键,因此您需要取消设置旧键并创建新键。还有一种方法:
$array = array_combine(array_map('ucfirst', array_keys($array)), $array);
array\u keys
array\u map
array\u Combine
您无法修改
foreach
中的键,因此需要取消设置旧键并创建新键。还有一种方法:
$array = array_combine(array_map('ucfirst', array_keys($array)), $array);
array\u keys
array\u map
array\u Combine
foreach($array as $key => $value) {
$newkey = ucfirst($key);
$array[$newkey] = $value;
unset($array[$key]);
}
但是在循环时修改这样的数组是非常危险的。您最好将不可设置的键存储在另一个数组中,然后使用单独的循环将它们从原始数组中删除
当然,这不会检查aray中是否存在可能的冲突,例如,firstname->firstname
,其中firstname已经存在于数组中的其他位置
但最终,它归结为一个事实,你不能“重命名”一个键。您可以创建一个新项并删除原始项,但不能就地修改该项,因为该项是在aray中查找条目的项。更改键的值必然会更改该键指向的对象。这可能会起作用:
foreach($array as $key => $value) {
$newkey = ucfirst($key);
$array[$newkey] = $value;
unset($array[$key]);
}
但是在循环时修改这样的数组是非常危险的。您最好将不可设置的键存储在另一个数组中,然后使用单独的循环将它们从原始数组中删除
当然,这不会检查aray中是否存在可能的冲突,例如,firstname->firstname
,其中firstname已经存在于数组中的其他位置
但最终,它归结为一个事实,你不能“重命名”一个键。您可以创建一个新项并删除原始项,但不能就地修改该项,因为该项是在aray中查找条目的项。更改键的值必然会更改该键所指向的内容。
unset
foreach($array as $key => $value)
{
unset($array[$key]);
$array[ucfirst($key)] = $value;
}
unset
如果它已经是正确的格式,则首先将其删除,否则您将删除刚才定义的内容:
foreach($array as $key => $value)
{
unset($array[$key]);
$array[ucfirst($key)] = $value;
}
我的头顶
foreach($array as $key => $value){
$newKey = ucfirst($key);
$array[$newKey] = $value;
unset($array[$key]);
}
稍微改变你的思维方式。不要修改现有元素,而是创建一个新元素,然后删除旧元素。我的头顶
foreach($array as $key => $value){
$newKey = ucfirst($key);
$array[$newKey] = $value;
unset($array[$key]);
}
稍微改变你的思维方式。与其修改现有元素,不如创建一个新元素,然后删除旧元素。这里的答案很危险,如果密钥没有更改,该元素实际上会从数组中删除。此外,您可能会在不知不觉中覆盖已经存在的元素 您首先要做一些检查:
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”语句组合在一起,如果您不需要以不同的方式处理这些情况。这里的答案是危险的,如果不更改键,元素实际上会从数组中删除。此外,您可能会在不知不觉中覆盖已经存在的元素 您首先要做一些检查:
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]);
}
当然,您可能希望将这些“如果”语句与“或”语句结合起来,如果您不需要以不同的方式处理这些情况。如果您使用laravel或在依赖项中的某个位置有
illighted\Support
,以下是一种可链接的方式:
>>> collect($array)
->keys()
->map(function ($key) {
return ucfirst($key);
})
->combine($array);
=> Illuminate\Support\Collection {#1389
all: [
"FirstName" => "Joe",
"LastName" => "Smith",
],
}
如果您在依赖项中的某个位置使用了laravel或具有
illighted\Support
,以下是一种可链接的方式:
>>> collect($array)
->keys()
->map(function ($key) {
return ucfirst($key);
})
->combine($array);
=> Illuminate\Support\Collection {#1389
all: [
"FirstName" => "Joe",
"LastName" => "Smith",
],
}
如果密钥的第一个字母已经大写,那么这不就是从数组中删除该条目吗?应该是
取消设置
然后分配,对吗?@Tim这也正是我所想的,很确定这就是发生的事情。最好添加“if(if(ucfirst($key)=$key)continue;”作为循环的第一行。如果该键的第一个字母已经大写,这不就是从数组中删除该项吗?应该是取消设置
然后分配,对吗?@Tim这也正是我所想的,很确定这就是发生的事情。最好将“if(ucfirst($key)=$key)continue”添加为循环的第一行。非常酷的谢谢非常酷的谢谢