PHP:連想配列要素を配列の先頭に移動します


94

連想配列の要素を配列の先頭に移動する最良の方法は何でしょうか?

たとえば、次の配列があるとします。

$myArray = array(
    'two'   => 'Blah Blah Blah 2',
    'three' => 'Blah Blah Blah 3',
    'one'   => 'Blah Blah Blah 1',
    'four'  => 'Blah Blah Blah 4',
    'five'  => 'Blah Blah Blah 5',
);

私がしたいことは、「1」要素を最初に移動し、次の配列で終わることです:

$myArray = array(
    'one'   => 'Blah Blah Blah 1',
    'two'   => 'Blah Blah Blah 2',
    'three' => 'Blah Blah Blah 3',
    'four'  => 'Blah Blah Blah 4',
    'five'  => 'Blah Blah Blah 5',
);
php 

回答:


182

配列結合演算子(+)を使用すると、既知のキー(one)を使用して、元の配列を新しい連想配列に結合できます。

$myArray = array('one' => $myArray['one']) + $myArray;
// or      ['one' => $myArray['one']] + $myArray;

配列キーは一意であるため、2つの場所に存在することは不可能です。

php.net/manual/en/language.operators.array.phpを参照してください:

+演算子は、左側の配列に追加された右側の配列を返します。両方の配列に存在するキーの場合、左側の配列の要素が使用され、右側の配列の一致する要素は無視されます。


3
@andrewtweberいいえ、私はしませんが、いくつかのテストを行ったところ、Emilのアプローチと比較して、3倍速く、半分のメモリしか消費しないことがわかりました。また、同じ要素を配列の最後に移動するよりも20%時間がかかることもわかりました。
Mark Eirich

5

数値配列キーがあり、配列キーのインデックスを再作成する場合は、次のように配置することをお勧めしますarray_merge

$myArray = array_merge(array($key => $value) + $myArray );

2

少し遅れましたが、誰かが必要な場合に備えて、この小さなスニペットを作成しました。

function arr_push_pos($key, $value, $pos, $arr) 
{
    $new_arr = array();
    $i = 1;

    foreach ($arr as $arr_key => $arr_value) 
    {
        if($i == $pos) 
            $new_arr[$key] = $value;

        $new_arr[$arr_key] = $arr_value;

        ++$i;
    }

    return $new_arr;
}

ニーズに合わせて調整するか、使用してインデックスを設定解除して移動します。連想配列でも動作します。


訂正:$ new_arr [$ arr_key] = $ arr_value; if($ arr_key!= $ key)$ new_arr [$ arr_key] = $ arr_value; しかし、それ以外の場合:優れています!1アップ。
nzn 2015年

1

これを使用してこれを行う別の簡単なワンライナーは次のarray_splice()とおりです。

$myArray = array_splice($myArray,array_search('one',array_keys($myArray)),1) + $myArray;

1

2つの配列がある場合、1つ目は2つ目の要素配列の一番上に移動する要素を持ち、次のように使用できます。

$result = \array_replace($ArrayToMoveToTop, $myArray);

ここにコードサンプルがあります:

//source array    
$myArray = [
    'two' => 'Blah Blah Blah 2',
    'three' => 'Blah Blah Blah 3',
    'one' => 'Blah Blah Blah 1',
    'four' => 'Blah Blah Blah 4',
    'five' => 'Blah Blah Blah 5',
];
// set necessary order
$orderArray = [
    'one' => '',
    'two' => '',
];
//apply it
$result = \array_replace($orderArray, $myArray);
\print_r($result);

-1

PHPマニュアルのコメントに、array_unshiftの関数があり、キーを使用して要素を配列の先頭に追加できます。

function array_unshift_assoc(&$arr, $key, $val)
{
    $arr = array_reverse($arr, true);
    $arr[$key] = $val;
    return array_reverse($arr, true);
}

要素を設定解除し、上記の関数を使用して再度挿入します。

$tmp = $myArray['one'];
unset($myArray['one']);
$myArray = array_unshift_assoc($myArray, 'one', $tmp);

より一般的なアプローチは、uksortを使用して配列をキーでソートし、独自のソート機能を提供することです。


こんにちは-どうも配列を並べ替えたくありませんが、答えてくれてありがとう。要素のキーを知り、その特定の要素のみを配列の先頭に移動できるようにしたい

「=」は構文エラーだと思います:return = array_reverse($arr, true);
Mark Eirich

また、コードを実行すると、要素が1つだけの配列が
返さ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.