PHP: упорядочить ассоциативный массив

В php я хотел бы иметь возможность переупорядочить ассоциативный массив, перемещая элементы в определенные позиции в массиве. Не нужен сорт, просто переупорядочение по моему выбору.

В качестве примера, скажем, у меня есть ассоциативный массив следующим образом:

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

и в одном случае я могу переместить C до B и получить следующий результат:

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

или в другом случае я могу переместить C до A и получить следующий результат:

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

То, что я пытаюсь показать, – это просто метод для выражения «Эй, я хочу переместить этот элемент массива перед этим другим элементом массива» или «Привет, id, чтобы переместить этот элемент массива, чтобы убедиться, что он появился после этого другого массива элемент'

Надеюсь, это имеет смысл!

Спасибо всем, кто заботится, чтобы помочь мне с этим

Если вы хотите поменять два значения, вы можете сделать такую ​​функцию:

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

Для пользовательской сортировки вы можете, например, создать массив, который является желаемым порядком ключей, а затем связать значения с ними. Пример:

 $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 будут в указанном порядке.

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

Привет, я хочу переместить ['move me'] до ['b']. Я могу сделать это только с 4 строками кода!

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


Я сделал функцию для удобного использования:

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

Примеры:

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

Надеюсь, это поможет многим людям, потому что это потрясающая функция! : D

Здесь много сложных методов: На самом деле вы можете использовать функцию сохранения ключей 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); 

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