php associative array key order (not sort)
Two possible solutions (without using array_splice
):
1) Create a new array with the new order of the keys.
$new_keys = array('one', 'two', 'three');$new_data = array();foreach ($new_keys as $key) { $new_data[$key] = $data[$key];}$data = $new_data;
2) Move the element one
upfront, remove it from $data
and copy the rest of the array.
function rearrangeData($data) { $result['one'] = $data['one']; unset($data['one']); return array_merge($result, $data);} $data = rearrangeData($data);
Take a look at daniele centamore's comment on PHP's array_splice() function, where he provides a couple of functions for moving the elements in an non-associative array.
<?php// $input (Array) - the array containing the element// $index (int) - the index of the element you need to movefunction moveUp($input,$index) { $new_array = $input; if((count($new_array)>$index) && ($index>0)){ array_splice($new_array, $index-1, 0, $input[$index]); array_splice($new_array, $index+1, 1); } return $new_array;}function moveDown($input,$index) { $new_array = $input; if(count($new_array)>$index) { array_splice($new_array, $index+2, 0, $input[$index]); array_splice($new_array, $index, 1); } return $new_array;} $input = array("red", "green", "blue", "yellow");$newinput = moveUp($input, 2);// $newinput is array("red", "blue", "green", "yellow")$input = moveDown($newinput, 1);// $input is array("red", "green", "blue", "yellow")?>
Here's a working example:
<?php$data = array('two' => 2, 'one' => 1, 'three' => 3);print_r($data);ksort($data);echo "ksort:\n";print_r($data);uksort($data,'cmp');echo "uksort:\n";print_r($data);function cmp($a, $b){ $num=' one two three four five six seven eight nine ten'; $ai = stripos($num,$a); $bi = stripos($num,$b); if ($ai>0 && $bi>0) { return ($ai > $bi) ? 1 : -1; } return strcasecmp($a, $b);}
Output:
Array( [two] => 2 [one] => 1 [three] => 3)ksort:Array( [one] => 1 [three] => 3 [two] => 2)uksort:Array( [one] => 1 [two] => 2 [three] => 3)
Run this: http://codepad.org/yAK1b1IP