PHP: sort associative array

In php, I would like to be able to reorder an associative array by moving items to specific positions in the array. No sort needed, just reordering of my choice.

As an example, let's say I have an associative array as follows:

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

and in one case, I can move C to B and get the following result:

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

or in another case, I can move C to A and get the following result:

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

What I'm trying to show is just a method for the expression "Hey, I want to move this array element before this other array element" or "Hello, id, to move this array element to make sure it appears after this other array element '

Hope this makes sense!

Thanks to everyone who cares to help me with this.

+6
source share
5 answers

If you want to replace two values, you can make a function like this:

 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; } 
+2
source

For custom sorting, you can, for example, create an array that is the desired order of keys, and then associate the values ​​with them. Example:

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

Items in $out will be in that order.

+8
source
 $arr = array( 'a' => 1, 'b' => 2, 'move me' => 9, 'c' => 3, 'd' => 4, ); 

Hey, I want to move ['move me'] to ['b']. I can do this with only 4 lines of code!

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




I made a function for convenient use:
 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; } 


Examples:

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


Hope this helps a lot of people because it is an awesome feature !: D

+7
source

There are many complex methods here: Actually, you can use the array_slice() key saving function.

 $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); 
+1
source

array_splice unfortunately does not work with associative arrays, so here is something a little dirty:

 $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); 
0
source

Source: https://habr.com/ru/post/919425/


All Articles