php associative array key order (not sort)

人走茶凉 提交于 2019-11-29 05:50:24
Mark Baker

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 move

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

?>

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

PHP has 13 functions for sorting arrays, by key, by value, by user-defined functions where you can specify that "one" comes before "two". There's also array_shift, array_unshift, array_push and array_pop for moving things onto or off the front or end of the array. You can build a whole new array from the existing one.

See ksort and uksort.

Here's a working example:

<?php

$data = array('two' => 2, 'one' => 1, 'three' => 3);
print_r($data);
ksort($data);
print_r($data);
uksort($data,'cmp');
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
)
Array
(
    [one] => 1
    [three] => 3
    [two] => 2
)
Array
(
    [one] => 1
    [two] => 2
    [three] => 3
)

Run this: http://codepad.org/yAK1b1IP

I think, you should use asort function:

$data = array('two' => 2, 'one' => 1, 'three' => 3);

$dataOrdered = $data;
asort($dataOrdered);

Run this code

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!