php associative array key order (not sort)
My array:
$data = array('two' => 2, 'one' => 1, 'three' => 3);
Now, with when I iterate the array, the first value that will come up will probably be
$data['two'] // = 2 @ index[0]
right?
What if I want to move the $data[1] to the position of $data[0] ?
To rephrase:
How do I make the array look like this (so that 'one' comes up at $data[0])
$data = array('one' => 1, 'two' => 2, 'three' => 3
Why do I need this?
I use code igniter, the table->generate built-in function takes an assoc array and creates a table but offers no method of 开发者_Python百科arranging the columns. This is why I would like to move the columns in the source array.
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 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")
?>
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
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.
I think, you should use asort function:
$data = array('two' => 2, 'one' => 1, 'three' => 3);
$dataOrdered = $data;
asort($dataOrdered);
Run this code
精彩评论