2012-07-01 13 views
6

PHP में, मैं सरणी में कुछ स्थितियों में तत्वों को स्थानांतरित करके एक सहयोगी सरणी को फिर से ऑर्डर करने की क्षमता प्राप्त करना चाहता हूं। एक तरह से जरूरी नहीं है, बस मेरे चयन का एक पुन: आदेश।PHP: ऑर्डर एसोसिएटिव सरणी

array(
'a' => 'Element A', 
'b' => 'Element B', 
'c' => 'Element C', 
); 

और एक मामले में मैं बी से पहले सी ले जाने और निम्न परिणाम है करने के लिए चाहते हो सकता है:

array(
'a' => 'Element A', 
'c' => 'Element C', 
'b' => 'Element B', 
); 

या

उदाहरण के लिए, मैं इस प्रकार एक साहचर्य सरणी है कहना एक और मामले में मैं ए से पहले सी को स्थानांतरित करना चाहता हूं और निम्नलिखित परिणाम प्राप्त कर सकता हूं:

array(
'c' => 'Element C', 
'a' => 'Element A', 
'b' => 'Element B', 
); 

जो मैं दिखाने की कोशिश कर रहा हूं , यह कहने का एक तरीका है "अरे, मैं इस सरणी तत्व को इस अन्य सरणी तत्व से पहले ले जाना चाहता हूं" या "अरे, आईडी इस सरणी तत्व को स्थानांतरित करना चाहते हैं यह सुनिश्चित करने के लिए कि यह इस अन्य सरणी तत्व के बाद आता है '

उम्मीद है कि यह समझ में आता है!

अग्रिम में किसी को जो मुझे इस

+1

सहयोगी सरणी में कोई ऑर्डर नहीं है। – DonCallisto

+13

@ डॉन कैलिस्टो: यह पूरी तरह झूठा है। Arrays भी सूचियां हैं, और इस तरह के रूप में निश्चित रूप से एक अच्छी तरह से परिभाषित आदेश है। – Jon

+0

संभावित डुप्लिकेट [किसी अन्य सरणी का उपयोग करके क्रमबद्ध सरणी] [http://stackoverflow.com/questions/8935093/sort-array-using-another-array) – nickb

उत्तर

2

आप दो मानों स्वैप करने के लिए मतलब है, तो आप इस तरह एक समारोह कर सकता है:

function array_swap($key1, $key2, $array) { 
     $newArray = array(); 
     foreach ($array as $key => $value) { 
      if ($key == $key1) { 
       $newArray[$key2] = $array[$key2]; 
      } elseif ($key == $key2) { 
       $newArray[$key1] = $array[$key1]; 
      } else { 
       $newArray[$key] = $value; 
      } 
     } 
     return $newArray; 
    } 
+1

उत्तर के लिए धन्यवाद, लेकिन मुझे केवल –

+0

मानों को न केवल कुंजी को स्थानांतरित करने की आवश्यकता है, नए फ़ंक्शन को आजमाएं –

8

साथ मदद करने के लिए एक कस्टम छंटाई के लिए, आप उदाहरण के लिए एक सरणी है कि चाबियों का वांछित क्रम है बना सकते हैं और फिर उनके साथ मूल्यों सहयोगी परवाह करता है करने के लिए धन्यवाद। उदाहरण:

$input = array("a"=>"Element A","b"=>"Element B","c"=>"Element C"); 
$order = array("c","a","b"); 
$out = array(); 
foreach($order as $k) { 
    $out[$k] = $input[$k]; 
} 

$out में तत्वों निर्दिष्ट क्रम में हो जाएगा।

+0

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

0

array_splice दुर्भाग्य से साहचर्य सरणियों के साथ काम नहीं करता है, तो यहां कुछ थोड़ा मेसियर है:

$keys = array_keys($arr); 
$values = array_values($arr); 

$keyIndex = array_search($someKey, $keys); 
array_splice($keys, $keyIndex, 1); 
array_splice($values, $keyIndex, 1); 

$insertIndex = 1; 
array_splice($keys, $insertIndex, 0, array($someKey)); 
array_splice($values, $insertIndex, 0, array($arr[$someKey])); 

$arr = array_combine($keys, $values); 
7
$arr = array(
    'a' => 1, 
    'b' => 2, 
    'move me' => 9, 
    'c' => 3, 
    'd' => 4, 
); 

अरे, मैं ['बी'] से पहले ['मुझे स्थानांतरित करें]] ले जाना चाहता हूं। मैं इसे कोड की केवल 4 पंक्तियों के साथ कर सकता हूं!

function move_item(&$ref_arr, $key1, $move, $key2 = null) 
{ 
    $arr = $ref_arr; 
    if($key2 == null) $key2 = $key1; 
    if(!isset($arr[$key1]) || !isset($arr[$key2])) return false; 

    $i = 0; foreach($arr as &$val) $val = array('sort' => (++$i * 10), 'val' => $val); 

    if(is_numeric($move)) 
    { 
    if($move == 0 && $key1 == $key2) return true; 
    elseif($move == 0) { $tmp = $arr[$key1]['sort']; $arr[$key1]['sort'] = $arr[$key2]['sort']; $arr[$key2]['sort'] = $tmp; } 
    else $arr[$key1]['sort'] = $arr[$key2]['sort'] + ($move * 10 + ($key1 == $key2 ? ($move < 0 ? -5 : 5) : 0)); 
    } 
    else 
    { 
    switch($move) 
    { 
     case 'up':  $arr[$key1]['sort'] = $arr[$key2]['sort'] - ($key1 == $key2 ? 15 : 5); break; 
     case 'down': $arr[$key1]['sort'] = $arr[$key2]['sort'] + ($key1 == $key2 ? 15 : 5); break; 
     case 'top': $arr[$key1]['sort'] = 5; break; 
     case 'bottom': $arr[$key1]['sort'] = $i * 10 + 5; break; 
     default: return false; 
    } 
    } 
    uasort($arr, function($a, $b) { return $a['sort'] > $b['sort']; }); 
    foreach($arr as &$val) $val = $val['val']; 
    $ref_arr = $arr; 
    return true; 
} 


उदाहरण::

$i = 0; foreach($arr as &$val) $val = array('sort' => (++$i * 10), 'val' => $val); 
$arr['move me']['sort'] = $arr['b']['sort'] - 5; 
uasort($arr, function($a, $b) { return $a['sort'] > $b['sort']; }); 
foreach($arr as &$val) $val = $val['val']; 




मैं आसान उपयोग के लिए एक समारोह बना

move_item($arr, 'move me', 'up'); //move it one up 
move_item($arr, 'move me', 'down'); //move it one down 
move_item($arr, 'move me', 'top'); //move it to top 
move_item($arr, 'move me', 'bottom'); //move it to bottom 

move_item($arr, 'move me', -1); //move it one up 
move_item($arr, 'move me', 1); //move it one down 
move_item($arr, 'move me', 2); //move it two down 

move_item($arr, 'move me', 'up', 'b'); //move it before ['b'] 
move_item($arr, 'move me', -1, 'b'); //move it before ['b'] 
move_item($arr, 'move me', 'down', 'b'); //move it after ['b'] 
move_item($arr, 'move me', 1, 'b'); //move it after ['b'] 
move_item($arr, 'move me', 2, 'b'); //move it two positions after ['b'] 

//Special syntax, to swap two elements: 
move_item($arr, 'a', 0, 'd'); //Swap ['a'] with ['d'] 


मुझे आशा है कि यह बहुत से लोगों को मदद मिलती है, क्योंकि यह एक अद्भुत functi है पर! : डी

1

यहां कई कठिन विधियां हैं :) वास्तव में, आप array_slice() की संरक्षित कुंजी सुविधा का उपयोग कर सकते हैं।

$new_element = array('new_key' => 'value'); 

// if needed, find the insertion index by key 
$index = array_search('key to search', array_keys($old_array)); 

// add element at index (note the last array_slice argument) 
$new_array = array_slice($old_array, 0, $index+1, true) + $new_element + array_slice($old_array, $index+1, null, true); 
संबंधित मुद्दे