2012-04-16 16 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 मूल पैरामीटर को कॉपी नहीं करेगा जब तक कि इसे संशोधित नहीं किया जाता है (जिसे कॉपी-ऑन-राइट, गाय कहा जाता है)। इस दृष्टिकोण से मुझे इस विशेष मामले में संदर्भों का उपयोग करने के किसी भी फायदे नहीं दिखते हैं – 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/03 स्वीकार्य उत्तर काम करता है यदि आप सरणी_search का तीसरा पैरामीटर (सख्त) सत्य पर सेट करते हैं।

+1

सही है, लेकिन सरणी_की में सत्य में "सख्त" ध्वज को बस सेट करने से आपको वांछित आउटपुट मिल जाएगा और आपको कोड की 8 लाइनें मिलेंगी। $ index = array_search बदलना ($ key1, $ कुंजी); $ index = array_search ($ key1, $ कुंजी, सत्य); इसके बाद के संस्करण समारोह में सही परिणाम उत्पन्न करता है: [ 'k1' => 'k1', 'k2' => 'k2', 0 => 'K3', 'कुछ' => 'K4' ] – Cragmonkey

+2

धन्यवाद, आप सही हैं। मैंने अंततः यह भी पता लगाया लेकिन इस पोस्ट के बारे में भूल गया। इसे अभी अपडेट कर देगा। –

+0

बस इसके लिए आपको धन्यवाद देना चाहता था ... सराहना की! – salih0vicX

2

पीएचपी के साथ एक सामान्य और सरल उपाय 5.3+ 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
इसके बजाय छोरों का उपयोग करने का

, आप हमेशा 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 
         ) 
       ) 
     ) 
) 
संबंधित मुद्दे