2012-07-30 12 views
9

Tôi có một mảng như dưới đâythay thế phím mảng với các phím tương ứng cho

$old = array(
     'a' => 'blah', 
     'b' => 'key', 
     'c' => 'amazing', 
     'd' => array(
       0 => 'want to replace', 
       1 => 'yes I want to' 
      ) 
     ); 

Tôi có một mảng có phím để thay thế những thông tin quan trọng.

$keyReplaceInfoz = array('a' => 'newA', 'b' => 'newB', 'c' => 'newC', 'd' => 'newD'); 

tôi cần phải thay thế tất cả các phím của mảng $old với giá trị tương ứng trong mảng $keyReplaceInfo.

Output nên như thế này

$old = array(
     'newA' => 'blah', 
     'newB' => 'key', 
     'newC' => 'amazing', 
     'newD' => array(
       0 => 'want to replace', 
       1 => 'yes I want to' 
      ) 
     ); 

tôi phải làm nó bằng tay như dưới đây. Tôi đang mong đợi lựa chọn tốt hơn. bất cứ ai có thể đề nghị cách tốt hơn để thực hiện điều này?

$new = array(); 
foreach ($old as $key => $value) 
{ 
    $new[$keyReplaceInfoz[$key]] = $value; 
} 

Tôi biết điều này có thể đơn giản hơn nhiều.

Trả lời

14
array_combine(array_merge($old, $keyReplaceInfoz), $old) 

Tôi nghĩ rằng điều này có vẻ dễ dàng hơn so với những gì bạn đặt ra.

+0

'array_combine' sẽ chỉ hoạt động nếu các khóa và giá trị theo đúng thứ tự và có thay thế cho mỗi khóa. (Tôi tự coi đây là giải pháp). – Leigh

+0

Trên thực tế vấn đề duy nhất với ở trên là nó sẽ không hoạt động nếu không có sự thay thế cho mỗi khóa. Đặt hàng không phải là một vấn đề vì array_merge ($ old, $ keyReplaceInfoz). – Summoner

+0

Có một vài vấn đề, cả hai đều liên quan đến số yếu tố. Nếu mảng thay thế chứa một khóa không nằm trong mảng cũ, sẽ có một cảnh báo PHP (và không có gì sẽ được thay thế). Nếu mảng thay thế thiếu khóa từ mảng cũ, khóa trong mảng cũ sẽ được thay thế bằng _value_ riêng của nó – Leigh

0
<?php 
$new = array(); 

foreach ($old as $key => $value) 
{ 
    $new[$keyReplaceInfoz][$key] = $value; 

} 
?> 
+0

Điều này không tạo ra mảng đầu ra mà OP đang yêu cầu. Vui lòng kiểm tra mã của bạn trước khi đăng. – Leigh

+0

cảm ơn, tôi đã đặt mã của mình một cách nhanh chóng và tôi không kiểm tra. – chenio

-1
<?php 
$old = array(
     'a' => 'blah', 
     'b' => 'key', 
     'c' => 'amazing', 
     'd' => array(
       0 => 'want to replace', 
       1 => 'yes I want to' 
      ) 
     ); 
$keyReplaceInfoz = array('a' => 'newA', 'b' => 'newB', 'c' => 'newC', 'd' => 'newD'); 

$new = array(); 

foreach ($old as $key => $value) 
{ 
    $newvalue = $keyReplaceInfoz[$key]; 
    $new[$key] = $newvalue; 
} 
print_r($new); 

?> 
+0

Điều này sẽ thay đổi giá trị, tôi không muốn thay đổi giá trị, tôi muốn thay đổi khóa. –

1

Tôi chỉ giải quyết vấn đề này như nhau trong ứng dụng của riêng tôi, nhưng đối với ứng dụng của tôi $ keyReplaceInfoz hoạt động như các whitelist- nếu một phím không được tìm thấy, mà cả yếu tố được lấy ra từ các mảng kết quả, trong khi khớp lệnh trong danh sách trắng các phím được dịch sang các giá trị mới.

Tôi cho rằng bạn có thể áp dụng cùng một thuật toán này có thể với tổng số ít mã hơn bằng cách sử dụng thông minh array_map (http://php.net/manual/en/function.array-map.php), có lẽ một người đọc hào phóng khác sẽ làm.

function filterOldToAllowedNew($key_to_test){  
    return isset($keyReplaceInfoz[$key_to_test])?$keyReplaceInfoz[$key_to_test]:false; 
} 

$newArray = array(); 

foreach($old as $key => $value){ 
    $newkey = filterOldToAllowedNew($key); 
    if($newkey){ 
     $newArray[$newkey] = $value; 
    } 
} 

print_r($newArray); 
2

Thích ứng @ shawn-k giải pháp, ở đây là nhiều mã sạch sử dụng array_walk, nó sẽ chỉ thay thế các khóa mong muốn, tất nhiên bạn có thể thay đổi theo sự thuận tiện của bạn

array_walk($old, function($value,$key)use ($keyReplaceInfoz,&$old){ 
     $newkey = array_key_exists($key,$keyReplaceInfoz)?$keyReplaceInfoz[$key]:false; 
     if($newkey!==false){$old[$newkey] = $value;unset($old[$key]); 
     } 
    }); 

    print_r($old); 
0

Đây là giải pháp tôi có được triển khai cho cùng một chủ đề:

/** 
* Replace keys of given array by values of $keys 
* $keys format is [$oldKey=>$newKey] 
* 
* With $filter==true, will remove elements with key not in $keys 
* 
* @param array $array 
* @param array $keys 
* @param boolean $filter 
* 
* @return $array 
*/ 
function array_replace_keys(array $array,array $keys,$filter=false) 
{ 
    $newArray=[]; 
    foreach($array as $key=>$value) 
    { 
     if(isset($keys[$key])) 
     { 
      $newArray[$keys[$key]]=$value; 
     } 
     elseif(!$filter) 
     { 
      $newArray[$key]=$value; 
     } 
    } 

    return $newArray; 
} 
+0

Điều này khác với phương pháp được hiển thị trong câu hỏi? –

+0

Vì phương pháp này không cần có một khóa thay thế cho mỗi khóa trong mảng nguồn. Phương pháp được hiển thị trong câu hỏi sẽ đưa ra một lỗi nếu bất kỳ khóa nào của mảng nguồn không tồn tại trên các khóa thay thế mảng –

+0

Bạn đang đúng Juan, nhưng tôi chắc chắn rằng tôi sẽ có sẵn tất cả các khóa để thay thế. câu hỏi là cải thiện phương pháp. phương pháp của bạn vẫn thực hiện cùng một vòng lặp! –