2012-04-16 29 views

Trả lời

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

cách tiếp cận Khá thú vị, trong tôi ý kiến ​​nó sẽ là tốt hơn để vượt qua mảng như tài liệu tham khảo. – Nazariy

+2

@Nazariy: php sẽ không sao chép thông số ban đầu cho đến khi nó được sửa đổi (được gọi là copy-on-write, COW). Từ quan điểm này, tôi không thấy bất kỳ lợi thế nào khi sử dụng các tham chiếu trong trường hợp cụ thể này – zerkms

+0

Cảm ơn zerkms, một cách tiếp cận thanh lịch. –

1

một câu trả lời tốt đã được đăng, nhưng đây là hai xu của tôi:

$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; 

để đáp ứng với mike-Purcell đây sẽ là một cách tiếp cận được chấp nhận hơn đối với ví dụ của tôi ở trên?

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

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

Tôi luôn tìm cách để cải thiện :)

+0

Không nên sử dụng các giá trị mã hóa cứng. –

4

Có một lỗ hổng trong logic của câu trả lời chấp nhận.

Nếu bạn có một mảng như thế này:

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

và thay thế 'k4' với 'cái gì' bạn sẽ nhận được một kết quả như thế này:

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

Đây là một sửa chữa nhanh chóng mà giải quyết vấn đề:

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/03 Câu trả lời được chấp nhận không hoạt động nếu bạn đặt tham số thứ ba (strict) của array_search thành true.

+1

Đúng, nhưng chỉ cần đặt cờ "nghiêm ngặt" thành true trong array_keys sẽ giúp bạn có được kết quả mong muốn và lưu lại 8 dòng mã. Thay đổi $ index = array_search ($ key1, $ keys); tới $ index = array_search ($ key1, $ keys, true); trong chức năng trên tạo kết quả chính xác: [ 'k1' => 'k1', 'k2' => 'k2', 0 => 'k3', 'something' => 'k4' ] – Cragmonkey

+2

Cảm ơn, bạn đã đúng. Tôi cũng đã tìm ra điều này cuối cùng nhưng quên về bài đăng này. Sẽ cập nhật nó ngay bây giờ. –

+0

Chỉ muốn cảm ơn bạn vì điều này ... Được đánh giá cao! – salih0vicX

2

Một giải pháp chung chung và đơn giản với PHP 5.3+ sử dụng array_walk:

$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

Thay vì sử dụng các vòng lặp, bạn luôn có thể san bằng để chuỗi với json_encode(), thực hiện một sự thay thế chuỗi, sau đó json_decode() trở lại một mảng:

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

Bây giờ điều này không kiểm tra xung đột với các khóa đã tồn tại (dễ đủ để thêm kiểm tra so sánh chuỗi) và nó có thể không phải là giải pháp tốt nhất cho các thay thế đơn lẻ trong mảng lớn. phần tốt đẹp về làm phẳng mảng thành một chuỗi thay thế là nó có hiệu quả làm cho đệ quy thay thế kể từ trận đấu ở bất kỳ độ sâu đều được thay thế trong một pass:

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

đầu ra

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 
         ) 
       ) 
     ) 
) 
Các vấn đề liên quan