2012-07-01 44 views
6

Trong php, tôi muốn có khả năng sắp xếp lại một mảng kết hợp bằng cách di chuyển các phần tử đến các vị trí nhất định trong mảng. Không cần thiết, chỉ cần sắp xếp lại lựa chọn của tôi.PHP: mảng kết hợp thứ tự

Như một ví dụ, nói rằng tôi có một mảng kết hợp như sau:

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

và trong một trường hợp tôi có thể muốn di chuyển C trước khi B và có kết quả như sau:

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

hoặc trong trường hợp khác tôi có thể muốn di chuyển C trước A và có kết quả như sau:

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

Điều tôi đang cố gắng hiển thị , chỉ đơn giản là phương thức để nói "Này, tôi muốn di chuyển phần tử mảng này trước phần tử mảng khác" hoặc "Này, id muốn di chuyển phần tử mảng này để đảm bảo rằng phần tử này xuất hiện sau phần tử mảng khác '

Hy vọng rằng điều này có ý nghĩa!

Cảm ơn bạn cho bất cứ ai trước ai muốn giúp tôi với điều này

+1

(Các) mảng kết hợp không có bất kỳ thứ tự nào. – DonCallisto

+13

@DonCallisto: Điều đó hoàn toàn sai. Mảng cũng là danh sách, và như vậy chắc chắn nhất có một thứ tự được xác định rõ. – Jon

+0

có thể trùng lặp của [Sắp xếp mảng sử dụng mảng khác] (http://stackoverflow.com/questions/8935093/sort-array-using-another-array) – nickb

Trả lời

2

Nếu bạn có ý nghĩa để trao đổi hai giá trị mà bạn có thể thực hiện một chức năng như thế này:

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

Cảm ơn câu trả lời, nhưng tôi cũng cần phải di chuyển các phím, không chỉ các giá trị –

+0

Bây giờ hãy thử chức năng mới –

8

Đối với một phân loại tùy chỉnh, bạn có thể ví dụ như tạo ra một mảng đó là thứ tự mong muốn trong những chìa khóa và sau đó kết hợp các giá trị với họ. Ví dụ:

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

Các thành phần trong $out sẽ theo thứ tự được chỉ định.

+0

Điều này sẽ không hoạt động cho vấn đề của tôi. Tôi cần phải di chuyển một phần tử đến trước hoặc sau một phần tử khác. Vì vậy, phương pháp của tôi sẽ chỉ được đưa ra hai phím –

0

array_splice tiếc là không làm việc với mảng kết hợp, vì vậy đây là một cái gì đó một Messier nhỏ:

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

Xin chào, tôi muốn di chuyển ['di chuyển tôi'] trước ['b']. Tôi có thể làm điều đó chỉ với 4 dòng mã!

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




tôi đã thực hiện một chức năng để dễ dàng sử dụng:

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


Ví dụ:

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'] 


Tôi hy vọng điều này sẽ giúp rất nhiều người, bởi vì nó là một functi tuyệt vời trên! : D

1

Rất nhiều phương pháp khó khăn ở đây :) Trên thực tế, bạn có thể khai thác tính năng bảo toàn khóa của 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); 
Các vấn đề liên quan