web-dev-qa-db-ja.com

PHPで既知のキーを持つ配列要素を配列の最後に移動するにはどうすればよいですか?

かなり些細な問題で脳がフリーズする。このような配列から始める場合:

$my_array = array(
                  'monkey'  => array(...),
                  'giraffe' => array(...),
                  'lion'    => array(...)
);

...そして、新しい要素が異なるキーで追加されるかもしれませんが、常に配列値です。これで、最初の要素には常にキー 'monkey'が含まれることを確認できますが、他のキーのいずれかは確認できません。

配列の入力が完了したら、他の要素の順序を乱すことなく、既知の要素 'monkey'を配列の最後に移動します。これを行う最も効率的な方法は何ですか?

私が考えることができるすべての方法は少し不格好に思え、私は明白な何かを見逃しているように感じます。

46
tamewhale

私がこれを行うと考えることができる唯一の方法は、それを削除してから追加することです:

$v = $my_array['monkey'];
unset($my_array['monkey']);
$my_array['monkey'] = $v;
86
cletus

array_shift はおそらく インデックスの設定解除 よりも効率的ではありませんが、動作します:

$my_array = array('monkey' => 1, 'giraffe' => 2, 'lion' => 3);
$my_array['monkey'] = array_shift($my_array);
print_r($my_array);

別の方法は、コールバックと ksort を使用することです。

uksort($my_array, create_function('$x,$y','return ($y === "monkey") ? -1 : 1;'));

PHP5.3 +を使用している場合、または関数をグローバル関数として定期的に定義する場合は、適切な lambda を使用する必要があります。

8
Gordon

上記の@Gordonの答えは、1ライナーとしての優雅さでとても気に入っていますが、キーが先頭にある場合にのみ機能します。任意の位置のキーに使用できるライナーがもう1つあります。

$arr = array('monkey' => 1, 'giraffe' => 2, 'lion' => 3);
$arr += array_splice($arr,array_search('giraffe',array_keys($arr)),1);

編集:注意、これは数字キーで失敗します。

3
billynoah

受け入れられた応答への貢献-同じ位置に要素を挿入せず、配列の最後に配置するため:

$v = $my_array['monkey'];
unset($my_array['monkey']);

の代わりに:

$my_array['monkey'] = $v;

使用する:

array_Push($my_array, $v);

いくつかの基本的な計算を実装して、配列要素をある位置から別の位置に移動するための汎用関数を取得できます。

PHPの場合、次のようになります。

function magicFunction ($targetArray, $indexFrom, $indexTo) { 
    $targetElement = $targetArray[$indexFrom]; 
    $magicIncrement = ($indexTo - $indexFrom) / abs ($indexTo - $indexFrom); 

    for ($Element = $indexFrom; $Element != $indexTo; $Element += $magicIncrement){ 
        $targetArray[$Element] = $targetArray[$Element + $magicIncrement]; 
    } 

    $targetArray[$indexTo] = $targetElement; 
}

詳細な説明については、「gloommatter」の「moving array elements」を参照してください。

http://www.gloommatter.com/DDesign/programming/moving-any-array-elements-universal-function.html

1
Andrea