PHP: Memindahkan elemen array asosiatif ke awal array

94

Apa metode terbaik untuk memindahkan elemen apa pun dari array asosiatif ke awal array?

Misalnya, saya memiliki array berikut:

$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',
);

Yang ingin saya lakukan adalah memindahkan elemen 'satu' ke awal dan berakhir dengan array berikut:

$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',
);

sumber

Jawaban:

182

Anda bisa menggunakan operator union array ( +) untuk menggabungkan array asli ke array asosiatif baru menggunakan kunci yang diketahui ( one).

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

Kunci array itu unik, jadi tidak mungkin ada di dua lokasi.

Lihat lebih lanjut di dokumen tentang Operator Array:

Operator + mengembalikan larik kanan yang ditambahkan ke larik kiri; untuk kunci yang ada di kedua larik, elemen dari larik kiri akan digunakan, dan elemen yang cocok dari larik kanan akan diabaikan.

Mark Eirich
sumber
3
@andrewtweber Tidak, saya tidak melakukannya, tetapi saya melakukan beberapa pengujian dan menemukan bahwa, dibandingkan dengan pendekatan Emil, ini 3x lebih cepat dan memakan setengah memori. Saya juga menemukan bahwa dibutuhkan 20% lebih banyak waktu daripada memindahkan elemen yang sama ke akhir larik.
Mark Eirich
5

Jika Anda memiliki kunci array numerik dan ingin mengindeks ulang kunci array, akan lebih baik untuk memasukkannya array_mergeseperti ini:

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

Agak terlambat, tetapi jika ada yang membutuhkannya, saya membuat cuplikan kecil ini.

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

Cukup sesuaikan dengan kebutuhan Anda, atau gunakan dan hapus pengaturan indeks untuk bergerak. Bekerja dengan array asosiatif juga.

Sune
sumber
Koreksi: $ new_arr [$ arr_key] = $ arr_value; Seharusnya: if ($ arr_key! = $ Key) $ new_arr [$ arr_key] = $ arr_value; Tapi sebaliknya: luar biasa! 1up.
nzn
1

Berikut satu baris sederhana lainnya yang menyelesaikan ini menggunakan array_splice():

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

jika Anda memiliki 2 larik, pertama memiliki elemen untuk dipindahkan ke atas larik kedua elemen, Anda dapat menggunakan

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

Berikut adalah contoh kode:

//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);
Eugene Kaurov
sumber
-1

Ada fungsi di komentar manual PHP untuk array_unshift yang dapat digunakan untuk menambahkan elemen, dengan kunci, ke awal array:

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

Batalkan setel elemen dan masukkan kembali dengan fungsi di atas:

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

Pendekatan yang lebih umum mungkin menggunakan uksort untuk mengurutkan array Anda berdasarkan kunci dan menyediakan fungsi penyortiran Anda sendiri.

Emil Vikström
sumber
Hai - terima kasih atas jawabannya, meskipun saya tidak ingin mengurutkan array dengan cara apa pun. Saya ingin dapat mengetahui kunci elemen dan hanya memindahkan elemen spesifik itu ke awal larik
Saya pikir "=" adalah kesalahan sintaks:return = array_reverse($arr, true);
Mark Eirich
Juga, ketika saya menjalankan kode Anda, saya mendapatkan array dengan hanya satu elemen di dalamnya ... :-(
Mark Eirich