2011-12-22 21 views
5

में जोड़े मैं एक सरणी है? जैसे इस सरणी का उत्पादन करने के लिए:स्वैप दो कुंजी/मान एक सरणी

$array = array('d' => 'val4', 'b' => 'val2', 'c' => 'val3', 'a' => 'val1'); 

धन्यवाद :)।

+0

अपने नमूना कोड में आप एक सहयोगी सरणी का उपयोग कर रहे हैं। कुंजी => मान ऑर्डर किसी एसोसिएटिव सरणी में कोई फर्क नहीं पड़ता क्योंकि एक एसोसिएटिव सरणी का कारण उनकी कुंजी से मानों तक पहुंचना है और सरणी में उनकी स्थिति नहीं है। –

+0

@ डेविडमेयर्स: यदि आप 'foreach ($ array = $ $ value के रूप में $ array) कर रहे हैं, तो ऑर्डर मायने रख सकता है। उदाहरण के लिए: एक HTML सूची या तालिका। –

+2

@ रॉकेट मैं सहमत हूं कि यह हो सकता है, लेकिन मैं सुझाव दूंगा कि डेटा व्यवस्थित करने के कई बेहतर तरीके हैं। यदि यह एसक्यूएल से आ रहा है तो ORDER BY का उपयोग कर रहा है। यदि आप बाद में फिर से व्यवस्थित कर सकते हैं, तो आप ऑर्डर के आधार पर प्रोग्राम को सरणी में जानकारी जोड़ सकते हैं। ऐसा लगता है कि सरणी हार्ड-कोडेड नहीं है, इस मामले में आपको इसे उस क्रम में लिखना चाहिए जिसे आप चाहते हैं। –

उत्तर

3

मैंने सोचा था कि वास्तव में इसका सरल उत्तर अब तक नहीं होगा, तो मैं ढेर में मेरा फेंक देंगे:

// Make sure the array pointer is at the beginning (just in case) 
reset($array); 

// Move the first element to the end, preserving the key 
$array[key($array)] = array_shift($array); 

// Go to the end 
end($array); 

// Go back one and get the key/value 
$v = prev($array); 
$k = key($array); 

// Move the key/value to the first position (overwrites the existing index) 
$array = array($k => $v) + $array; 

यह पहली और आखिरी तत्वों की अदला-बदली कर रहा है सरणी, संरक्षण कुंजी। मैंने सोचा था कि आप मूल रूप से array_flip() चाहते थे, इसलिए उम्मीद है कि मैं सही ढंग से समझ गया हूं।

डेमो: http://codepad.org/eTok9WA6

+2

मेरी आंत महसूस यह है कि आपको * वास्तव में * ऐसा करने की आवश्यकता नहीं है, और एक और समस्या है जिसे आप हल करना चाहते हैं, लेकिन आपने इसे समाधान के रूप में चुना है। शायद मैं गलत हूं, लेकिन मैं इसे थोड़ा सा देखता हूं। –

+1

यह एक साफ समाधान है। हालांकि, वह केवल दो और आखिरी न केवल दो मनमानी कुंजी स्वैप करना चाहता है। वैसे भी +1 क्योंकि यह एक अच्छा समाधान है। –

+0

वह यह चाह सकता है अगर इस सरणी को किसी चीज़ के लिए HTML तालिका के लिए उपयोग किया जा रहा है, और ऑर्डर मायने रखता है। –

0

क्या आप प्रत्येक के लिए मूल्य को केवल एक चर में स्टोर नहीं कर सकते हैं?

$val1 = $array[0]; 
$val2 = $array[3]; 
$array[0] = $val2; 
$array[3] = $val1; 
+1

ऐसा लगता है कि ऑर्डर बदल गया है, मान नहीं। –

1

आदर्श नहीं है, लेकिन क्या आप क्या करना चाहते है:

$array = array('a' => 'val1', 'b' => 'val2', 'c' => 'val3', 'd' => 'val4'); 

$keys = array_keys($array); 
swap($keys, 0, 3); 
$values = array_values($array); 
swap($values, 0, 3); 
print_r(array_combine($keys, $values)); // Array ([d] => val4 [b] => val2 [c] => val3 [a] => val1) 

function swap (&$arr, $e1, $e2) 
{ 
    $temp = $arr[$e1]; 
    $arr[$e1] = $arr[$e2]; 
    $arr[$e2] = $temp; 
} 
कोर्स दोनों अनुक्रमित swap समारोह में सेट कर रहे हैं यदि आप भी जाँच करनी चाहिए की

(isset का प्रयोग करके)

+0

आप संख्यात्मक कुंजी का उपयोग करने के बजाय 'array_search ('a', $ keys) 'का उपयोग कर सकते हैं। –

2

बेस्ट एक चाबियाँ और मूल्यों के सरणी बनाना है। दोनों सरणी में पदों को स्वैप करें, और फिर एक साथ वापस रखो।

function swapPos(&$arr, $pos1, $pos2){ 
    $keys = array_keys($arr); 
    $vals = array_values($arr); 
    $key1 = array_search($pos1, $keys); 
    $key2 = array_search($pos2, $keys); 

    $tmp = $keys[$key1]; 
    $keys[$key1] = $keys[$key2]; 
    $keys[$key2] = $tmp; 

    $tmp = $vals[$key1]; 
    $vals[$key1] = $vals[$key2]; 
    $vals[$key2] = $tmp; 

    $arr = array_combine($keys, $vals); 
} 

डेमो: http://ideone.com/7gWKO

0

आप किसी भी कुंजी को सरणी में किसी भी मूल्य स्वैप करने के लिए इस सुविधा का उपयोग कर सकते हैं।

/** 
* switch value with value on key in given array 
* array_switch(array(a, b ,c), c,0); 
* will return array(c, b, a); 
* 
* 
* @param array $array    
* @param mixed $value    
* @param mixed $key    
* @return array 
*/ 
public static function array_switch(&$array, $value, $key) 
{ 
    // find the key of current value 
    $old_key = array_search($value, $array); 
    // store value on current key in tmep 
    $tmp = $array[$key]; 
    // set values 
    $array[$key] = $value; 
    $array[$old_key] = $tmp;  
    return $array; 
} 
संबंधित मुद्दे