web-dev-qa-db-ja.com

PHPのforeachループで連想配列の$ keyを変更します

私はこのような配列を持っています:

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);
    }

私の知恵ではほとんどこれで終わります。私はMagento1.9.0.1 CEを使用していますが、これはこの問題にはまったく関係ありません。知っておく必要がある場合、これを行う必要がある理由は、SOAPクライアントにアセンブルされる配列として返されるオブジェクトの束があるためです。私が使用しているAPI使用するには、キーを大文字で始める必要があります...ただし、オブジェクトの変数名の最初の文字を大文字にしたくありません。愚かなことはわかっていますが、私たちは皆誰かに答えており、誰かがそのように望んでいます。 。

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

foreachのキーは変更できないため、新しいキーを作成し、古いキーの設定を解除する必要があります。別の方法は次のとおりです。

$array = array_combine(array_map('ucfirst', array_keys($array)), $array);
  1. array_keysを使用してキーを取得します
  2. array_mapを使用してキーにucfirstを適用します
  3. array_combineを使用して、新しいキーを値と組み合わせます
11
AbraCadaver

ここでの答えは危険です。キーが変更されていない場合、要素は実際には配列から削除済みです。また、すでに存在していた要素を無意識のうちに上書きする可能性もあります。

最初にいくつかのチェックを行う必要があります。

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」と組み合わせることをお勧めします。

2
Skeets

これはうまくいくかもしれません:

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

ただし、ループ中にこのような配列を変更するのは非常に危険です。設定できないキーを別の配列に格納してから、元の配列からそれらを削除するための別のループを用意することをお勧めします。

そしてもちろん、これはarayで起こりうる衝突をチェックしません。 firstname -> FirstName、FirstNameは配列の他の場所にすでに存在していました。

しかし、結局のところ、キーの「名前を変更」することはできないという事実に要約されます。新しいキーを作成して元のキーを削除することはできますが、キー[〜#〜] is [〜#〜]エントリを検索するためのキーであるため、キーをインプレースで変更することはできません。 arayで。キーの値を変更すると、必然的にそのキーが指しているものが変更されます。

1
Marc B

頭のてっぺん...

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

考え方を少し変えてください。既存の要素を変更する代わりに、新しい要素を作成し、古い要素を削除します。

1
Alex

laravelを使用するか、依存関係のどこかにIlluminate\Supportがある場合、連鎖可能な方法は次のとおりです。

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

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