php associative array key order (not sort) php associative array key order (not sort) php php

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")?>


See ksort and uksort.

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