Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中更改foreach循环中关联数组的$key_Php_Arrays_Foreach_Key_Associative Array - Fatal编程技术网

在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”添加为循环的第一行。非常酷的谢谢非常酷的谢谢