2012-04-16 23 views

cevap

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

Oldukça ilginç bir yaklaşım, içinde benim Düşünce referans olarak dizi geçmek daha iyi olurdu. – Nazariy

+2

@Nazariy: php değiştirilinceye kadar orijinal parametresini kopyalamaz (buna copy-on-write, COW denir). Bu bakış açısıyla, bu özel durumda referansları kullanmanın herhangi bir avantajını görmüyorum – zerkms

+0

Teşekkürler zerkms, zarif bir yaklaşım. –

1

iyi bir cevap gönderildi, ancak burada benim iki peni var: mike-Purcell cevaben

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

bu yukarıda benim örneğe daha kabul yaklaşım olurdu?

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

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

Hep iyileştirmek için arıyorum :)

+0

Sabit kod değerleri imo olmamalıdır. –

4

kabul edilen yanıt mantığında bir kusur yoktur.

böyle bir dizi varsa: İşte

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

o çözer çabuk oluyor:

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

ve 'şey' ile 'K4' yerine böyle bir çıkış alacak sorun:

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

DÜZENLEME: 2014/12/03 Kabul edilen yanıt, array_search üçüncü parametresini (katı) true olarak ayarlarsanız işe yarar.

+1

Doğru, ancak sadece "kesin" bayrağı array_keys'de true değerine ayarlayarak istediğiniz çıktıyı elde edersiniz ve size 8 satırlık kod kaydeder. $ index = array_search ($ key1, $ keys) değiştiriliyor; $ index = array_search ($ key1, $ tuşları, true); Yukarıdaki fonksiyonun doğru sonuç oluşturur: [ 'k1 => 'k1', 'k2'=> 'k2', 0 => 'k3', 'şey'=> 'K4' ] – Cragmonkey

+2

Teşekkürler, siz haklısınız. Sonunda bunu anladım ama bu yazıyı unuttum. Şimdi günceller. –

+0

Sadece bunun için teşekkür etmek istedim ... Takdir! – salih0vicX

2

bir jenerik ve basit array_walk kullanarak PHP ile çözüm 5.3+: döngüler kullanmak yerine

$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

, her zaman, json_encode() ile dizeye dümdüz olabilecek bir diziye geri, sonra json_decode() bir dize değiştirme gerçekleştirin:

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

Şimdi bu (bir dize karşılaştırma onay eklemek için basit olmalıdır) önceden var olan anahtarlar ile çakışmaları kontrol etmez ve masif dizilerde tek değiştirmeler için en iyi çözüm olmayabilir .. ama değiştirilmesi için bir dizeye dizi düzleştirme hakkında güzel kısmı her derinlikte maçlar hepsi tek geçişte değiştirilir beri etkili yedek özyinelemeli sağlamasıdır:

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

çıkışları

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 
         ) 
       ) 
     ) 
) 
İlgili konular