php associative array key order (not sort)

前端 未结 5 790
余生分开走
余生分开走 2020-12-17 10:38

My array:

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

Now, with when I iterate the array, the first value that wil

相关标签:
5条回答
  • 2020-12-17 11:00

    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);
    
    0 讨论(0)
  • 2020-12-17 11:00

    I think, you should use asort function:

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

    Run this code

    0 讨论(0)
  • 2020-12-17 11:06

    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")
    
    ?>
    
    0 讨论(0)
  • 2020-12-17 11:07

    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.

    0 讨论(0)
  • 2020-12-17 11:14

    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

    0 讨论(0)
提交回复
热议问题