2012-04-16 4 views

답변

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 (copy-on-write)라고 함). 이 관점에서 나는이 특별한 경우에 참조를 사용하는 것의 어떤 이점도 보지 못했다. – zerkms

+0

고맙다 zerkms, 우아한 접근. –

1

좋은 답변이 게시되어 있습니다 만, 여기 내 두 펜스는 다음과 같습니다 마이크 - 퍼셀에 응답

$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', 
    'something' => 'k3', 
    'k4'=>'k4' 
] 

그 해결하는 빠른 수정입니다 :

[ 
    'k1'=>'k1', 
    'k2'=>'k2', 
    'k3', 
    'k4'=>'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; 
} 

편집 : 2014년 12월 3일 array_search의 세 번째 매개 변수 (strict)를 true로 설정하면 허용되는 대답이 작동합니다.

+1

정확하지만 단순히 array_keys에서 "strict"플래그를 true로 설정하면 원하는 출력을 얻고 8 줄의 코드를 저장할 수 있습니다. $ index = array_search ($ key1, $ keys); 변경 ~ $ 인덱스 = 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_encode()와 문자열로 평평하게 할 수 배열의 뒤쪽으로, json_decode()을 문자열 교체를 수행

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

이제 문자열 비교 검사를 추가하기에 쉬운 기존 키와의 충돌을 검사하지 않으며 대량 배열의 단일 대체를위한 최상의 솔루션이 아닐 수 있습니다. 그러나 교체 문자열로 배열을 병합에 대한 좋은 부분은 깊이에서 경기 모두 한 번에 교체되기 때문에 효과적으로 교체 재귀를 만드는 것입니다 :

$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 
         ) 
       ) 
     ) 
) 
관련 문제