2012-04-16 5 views
15

は、私がこれを行うことができます方法:順序を維持しながら配列のキーを変更する方法は?

$array = array('a' => 1, 'd' => 2, 'c' => 3); //associative array 

// rename $array['d'] as $array['b'] 
$array = replace_key_function($array, 'd', 'b'); 

var_export($array); // array('a' => 1, 'b' => 2, 'c' => 3); same order! 

私はそれを行う機能を見ていません。 これを行う方法はありますか?

答えて

26

http://ideone.com/nCZnY

$array = array('a' => 1, 'd' => 2, 'c' => 3); //associative array 

// rename $array['d'] as $array['b'] 
$array = replace_key_function($array, 'd', 'b'); 

var_export($array); // array('a' => 1, 'b' => 2, 'c' => 3); same order! 

function replace_key_function($array, $key1, $key2) 
{ 
    $keys = array_keys($array); 
    $index = array_search($key1, $keys); 

    if ($index !== false) { 
     $keys[$index] = $key2; 
     $array = array_combine($keys, $array); 
    } 

    return $array; 
} 
+0

非常に興味深いアプローチ、意見を参考に配列を渡す方が良いでしょう。 – Nazariy

+2

@ Nazariy:phpは元のパラメータが変更されるまでコピーされません(コピーオンライト、COW)。このような観点から、この特定のケースでは参照を使用する利点はありません – zerkms

+0

ありがとうございますzerkms、優雅なアプローチ。 –

1

良い答えが掲載されているが、ここで私の2ペンスです:

$array = array('a'=>1, 'd'=>2, 'c'=>3); 
// rename 'd' to 'b' 
foreach($array as $k=>$v){ 
    if($k == 'd') { $k='b'; } 
     $newarray[$k] = $v; 
} 
$array = $newarray; 

マイク・パーセルに応じて、これは上記の私の例により受け入れられたアプローチでしょうか?

changeKey($array, 'd', 'b'); 

function changeKey($array, $oldKey, $newKey) 
{ 
    foreach($array as $k=>$v){ 
     if($k == $oldKey) { $k = $newKey; } 
     $returnArray[$k] = $v; 
    } 
    return $returnArray; 
} 

私はいつも受け入れ答えのロジックに欠陥があります:)

+0

値をハードコードしないでください。 –

4

を改善するために探しています。

あなたはこのような配列がある場合は「何か」が

[ 
    'k1'=>'k1', 
    'k2'=>'k2', 
    'k3', 
    'k4'=>'k4' 
] 

と置き換える「K4」を使用すると、このような出力を取得します:ここで

[ 
    'k1'=>'k1', 
    'k2'=>'k2', 
    'something' => 'k3', 
    'k4'=>'k4' 
] 

は解決簡単な修正であります問題:

function replace_key_function($array, $key1, $key2) 
{ 
    $keys = array_keys($array); 
    //$index = array_search($key1, $keys);   
    $index = false; 
    $i = 0; 
    foreach($array as $k => $v){ 
     if($key1 === $k){ 
      $index = $i; 
      break; 
     } 
     $i++; 
    } 

    if ($index !== false) { 
     $keys[$index] = $key2; 
     $array = array_combine($keys, $array); 
    } 

    return $array; 
} 

EDIT:2014年12月3日 array_searchの3番目のパラメータ(strict)をtrueに設定すると、受け入れられた回答が機能します。

+1

正しいですが、単にarray_keysで "strict"フラグをtrueに設定すると、望ましい出力が得られ、8行のコードを保存できます。 $ index = array_search($ key1、$ keys);を変更します。 $ index = array_search($ key1、$ keys、true);これは、上記の関数で正しい結果を生成する: [ 'K1' => 'K1' 'K2' => 'K2' 0 => 'K3' '何か' => 'K4' ] – Cragmonkey

+2

ありがとう、あなたは正しいです。私はまたこれを最終的に考え出したが、この投稿を忘れてしまった。今更新する予定です。 –

+0

ちょうどこれに感謝したいと思います...感謝! – salih0vicX

2

array_walkを使用してPHPと総称し、簡単な解決策5.3+:代わりにループを使用しての

$array = array('a' => 1, 'd' => 2, 'c' => 3); //associative array 

$array = replace_keys($array, array('d' => 'b')); 
var_export($array); // array('a' => 1, 'b' => 2, 'c' => 3); same order! 

function replace_keys(array $source, array $keyMapping) { 
    $target = array(); 
    array_walk($source, 
       function ($v, $k, $keyMapping) use (&$target) { 
        $mappedKey = isset($keyMapping[$k]) ? $keyMapping[$k] : $k; 
        $target[$mappedKey] = $v; 
       }, 
       $keyMapping); 
    return $target; 
} 
3

、いつでも戻って、アレイにjson_decode()その後、json_encode()で文字列に平らに文字列置換を行うことができます:

function replaceKey($array, $old, $new) 
{ 
    //flatten the array into a JSON string 
    $str = json_encode($array); 

    // do a simple string replace. 
    // variables are wrapped in quotes to ensure only exact match replacements 
    // colon after the closing quote will ensure only keys are targeted 
    $str = str_replace('"'.$old.'":','"'.$new.'":',$str); 

    // restore JSON string to array 
    return json_decode($str, TRUE);  
} 

さて、これは(文字列の比較チェックを追加して簡単に十分な)既存のキーとの競合をチェックしません、それは大規模な配列における単一の置換のための最善の解決策ではないかもしれません..しかし、交換のための文字列に配列を平坦化についての素晴らしい部分は、任意の深さでの試合はすべて1回のパスで置き換えられているので、それが効果的に交換用の再帰的になるということです。私の中

$arr = array(
    array(
     'name'  => 'Steve' 
     ,'city'  => 'Los Angeles' 
     ,'state' => 'CA' 
     ,'country' => 'USA' 
     ,'mother' => array(
      'name'  => 'Jessica' 
      ,'city'  => 'San Diego' 
      ,'state' => 'CA' 
      ,'country' => 'USA' 
     ) 
    ) 
    ,array(
     'name'  => 'Sara' 
     ,'city'  => 'Seattle' 
     ,'state' => 'WA' 
     ,'country' => 'USA' 
     ,'father' => array(
      'name'  => 'Eric' 
      ,'city'  => 'Atlanta' 
      ,'state' => 'GA' 
      ,'country' => 'USA' 
      ,'mother' => array(
       'name'  => 'Sharon' 
       ,'city'  => 'Portland' 
       ,'state' => 'OR' 
       ,'country' => 'USA' 
      ) 
     ) 
    ) 
); 
$replaced = replaceKey($arr,'city','town'); 
print_r($replaced); 

出力

Array 
(
    [0] => Array 
     (
      [name] => Steve 
      [town] => Los Angeles 
      [state] => CA 
      [country] => USA 
      [mother] => Array 
       (
        [name] => Jessica 
        [town] => San Diego 
        [state] => CA 
        [country] => USA 
       ) 
     ) 

    [1] => Array 
     (
      [name] => Sara 
      [town] => Seattle 
      [state] => WA 
      [country] => USA 
      [father] => Array 
       (
        [name] => Eric 
        [town] => Atlanta 
        [state] => GA 
        [country] => USA 
        [mother] => Array 
         (
          [name] => Sharon 
          [town] => Portland 
          [state] => OR 
          [country] => USA 
         ) 
       ) 
     ) 
) 
関連する問題