web-dev-qa-db-ja.com

php連想配列のキーの順序(並べ替えではありません)

私の配列:

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

さて、配列を反復すると、最初に表示される値はおそらく次のようになります。

$data['two'] // = 2 @ index[0]

正しい?

$ data [1]を$ data [0]の位置に移動したい場合はどうなりますか?

言い換えると:

配列を次のようにするにはどうすればよいですか(「one」が$ data [0]に表示されるように)

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

なぜこれが必要なのですか?

私はコードイグナイターを使用しています。table-> generate組み込み関数は連想配列を取り、テーブルを作成しますが、列を配置する方法を提供していません。これが、ソース配列の列を移動したい理由です。

16
nizzle

PHPの array_splice() 関数について daniele centamoreのコメント を見てください。ここでは、内の要素を移動するための関数をいくつか提供しています。非連想配列

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

?>
6
Mark Baker

2つの可能な解決策(array_spliceを使用しない):

1)キーの新しい順序で新しい配列を作成します。

$new_keys = array('one', 'two', 'three');
$new_data = array();
foreach ($new_keys as $key) {
    $new_data[$key] = $data[$key];
}
$data = $new_data;

2)要素oneを前もって移動し、$dataから削除して、配列の残りの部分をコピーします。

function rearrangeData($data) {
    $result['one'] = $data['one'];
    unset($data['one']);
    return array_merge($result, $data);
}    
$data = rearrangeData($data);
15
Diego Pino

ksort および ksort を参照してください。

これが実際の例です:

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

出力:

Array
(
    [two] => 2
    [one] => 1
    [three] => 3
)
ksort:
Array
(
    [one] => 1
    [three] => 3
    [two] => 2
)
uksort:
Array
(
    [one] => 1
    [two] => 2
    [three] => 3
)

これを実行します: http://codepad.org/yAK1b1IP

2
oriadam

PHPには 配列をソートするための13個の関数 、キー、値、ユーザー定義関数があり、「1」が「2」の前に来るように指定できます。 array_shift、array_unshift、array_Push、array_popもあり、配列の先頭または末尾に物を移動したり、配置から移動したりできます。既存のアレイからまったく新しいアレイを構築できます。

1
Dan Grossman