2012-07-30 16 views
9

मैं की तरहदिया संबंधित कुंजी के साथ सरणी कुंजी की जगह

नीचे
$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'); 

मैं सरणी $keyReplaceInfo में संबंधित मूल्यों के साथ सरणी $old के सभी कुंजी को बदलने के लिए की जरूरत है।

आउटपुट इस

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

मैं मैन्युअल रूप से नीचे के रूप में यह करने के लिए किया था की तरह होना चाहिए। मैं बेहतर विकल्प की उम्मीद कर रहा हूं। क्या कोई इसे पूरा करने के लिए बेहतर तरीका सुझा सकता है?

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

मुझे पता है कि यह अधिक सरल हो सकता है।

उत्तर

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

मैं इस तुम क्या उत्पन्न की तुलना में आसान लग रहा है लगता है।

+0

'array_combine' केवल तभी काम करेगा जब कुंजी और मान सही क्रम में हों, और प्रत्येक कुंजी के लिए एक प्रतिस्थापन है। (मैंने इसे स्वयं एक समाधान के रूप में देखा)। – Leigh

+0

वास्तव में उपर्युक्त के साथ एकमात्र समस्या यह है कि यदि प्रत्येक कुंजी के प्रतिस्थापन नहीं होता है तो यह काम नहीं करेगा। Array_merge ($ old, $ keyReplaceInfoz) की वजह से ऑर्डरिंग कोई समस्या नहीं है। – Summoner

+0

तत्वों के अंक से संबंधित कुछ समस्याएं हैं। यदि प्रतिस्थापन सरणी में एक कुंजी है जो पुराने सरणी में नहीं है, तो एक PHP चेतावनी होगी (और कुछ भी नहीं बदला जाएगा)। यदि प्रतिस्थापन सरणी पुराने सरणी से एक कुंजी गुम है, तो पुरानी सरणी में कुंजी को इसके अपने _value_ – Leigh

0
<?php 
$new = array(); 

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

} 
?> 
+0

यह आउटपुट सरणी ओपी लिए पूछ रहा है का उत्पादन नहीं करता। पोस्ट करने से पहले कृपया अपना कोड जांचें। – Leigh

+0

धन्यवाद, मैंने अपना कोड जल्दी से रखा है और मैं इसे जांच नहीं पा रहा हूं। – 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

इससे मूल्य बदल जाएगा, मैं मान को बदलना नहीं चाहता, मैं कुंजी बदलने के लिए चाहता हूं। –

1

मैं सिर्फ अपने ही आवेदन में यह एक ही समस्या हल हो, लेकिन अपने आवेदन के लिए $ keyReplaceInfoz की तरह काम करता whitelist- अगर एक चाबी नहीं पाया जाता है, कि पूरे तत्व है, जिसके परिणामस्वरूप सरणी से निकाल दिया जाता है, जबकि मिलान श्वेत सूची में चाबियाँ नए मानों में अनुवादित हो जाती हैं।

मुझे लगता है कि आप सरणी_मैप (http://php.net/manual/en/function.array-map.php) के चालाक उपयोग से कम कुल कोड के साथ शायद ही वही एल्गोरिदम लागू कर सकते हैं, जो शायद एक और उदार पाठक करेगा।

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

अनुकूल @ शॉन-कश्मीर समाधान, यहाँ array_walk का उपयोग कर अधिक क्लीनर कोड है, यह केवल वांछित कुंजी की जगह, बेशक आप अपनी सुविधानुसार

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

यह समाधान मेरे पास है के अनुसार संशोधित कर सकते हैं होगा एक ही विषय के लिए लागू:

/** 
* 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

प्रश्न में दिखाए गए तरीके से यह अलग कैसे है? –

+0

क्योंकि इस विधि को स्रोत सरणी में प्रत्येक कुंजी के लिए एक प्रतिस्थापन कुंजी की आवश्यकता नहीं है। प्रश्न में दिखाया गया तरीका एक त्रुटि देगा यदि स्रोत सरणी की कोई भी कुंजी प्रतिस्थापन कुंजी सरणी –

+0

पर मौजूद नहीं है, तो आप सही जुआन हैं, लेकिन मुझे यकीन था कि मेरे पास प्रतिस्थापन के लिए सभी कुंजी उपलब्ध होंगी। सवाल विधि को सुधारना था। आपकी विधि अभी भी वही लूपिंग करता है! –

संबंधित मुद्दे