PHP: İlişkilendirilebilir dizi elemanını dizinin başına taşı


97

Bir ilişkisel dizinin herhangi bir öğesini dizinin başlangıcına taşımanın en iyi yöntemi nedir?

Örneğin, aşağıdaki diziye sahip olduğumu varsayalım:

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

Yapmak istediğim şey, 'bir' öğeyi başa taşımak ve aşağıdaki dizi ile sonlandırmak:

$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 

Yanıtlar:


185

+Orijinal diziyi bilinen anahtarı ( one) kullanarak yeni bir ilişkilendirilebilir diziye birleştirmek için dizi birleştirme işlecini ( ) kullanabilirsiniz .

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

Dizi anahtarları benzersizdir, bu nedenle iki konumda bulunması imkansızdır.

Daha fazla Array Operatörleri belgesine bakın :

+ Operatörü, sol taraf dizisine eklenen sağ taraf dizisini döndürür; her iki dizide de bulunan anahtarlar için, sol taraftaki dizideki öğeler kullanılır ve sağ taraftaki diziden eşleşen öğeler yok sayılır.


3
@andrewtweber Hayır, bilmiyorum, ancak bazı testler yaptım ve Emil'in yaklaşımına kıyasla 3 kat daha hızlı olduğunu ve yarısı kadar bellek aldığını gördüm. Aynı öğeyi dizinin sonuna taşımaktan% 20 daha fazla zaman aldığını da buldum.
Mark Eirich

6

Sayısal dizi anahtarlarınız varsa ve dizi anahtarlarını yeniden dizine eklemek istiyorsanız, bunu şu şekilde koymak daha iyi olacaktır array_merge:

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

2

Biraz geç ama birinin ihtiyacı olursa bu küçük parçacığı oluşturdum.

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

İhtiyaçlarınıza uyacak şekilde ayarlayın veya hareket ettirmek için dizini kaldırın. İlişkili dizilerle de çalışır.


Bir düzeltme: $ new_arr [$ arr_key] = $ arr_value; Şöyle olmalıdır: if ($ arr_key! = $ Key) $ new_arr [$ arr_key] = $ arr_value; Ama aksi takdirde: mükemmel! 1 Yukarı.
nzn

1

İşte bunu kullanarak bunu yapan başka bir basit tek satırlık array_splice():

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

1

2 diziniz varsa, 1. dizinin 2. öğe dizisinin üstüne taşınacak öğeleri varsa

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

İşte bir kod örneği:

//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

Array_unshift için PHP kılavuzunun yorumlarında , bir dizinin başlangıcına anahtar ile bir eleman eklemek için kullanılabilecek bir işlev vardır :

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

Öğenin ayarını kaldırın ve yukarıdaki işlevi kullanarak yeniden yerleştirin:

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

Daha genel bir yaklaşım, dizinizi anahtarlara göre sıralamak ve kendinize ait bir sıralama işlevi sağlamak için uksort kullanmak olabilir .


Merhaba - yanıt için teşekkürler, yine de diziyi herhangi bir şekilde sıralamak istemiyorum. Bir öğe anahtarını bilmek ve yalnızca bu belirli öğeyi dizinin başlangıcına taşımak istiyorum

Sanırım "=" bir sözdizimi hatası:return = array_reverse($arr, true);
Mark Eirich

Ayrıca, kodunuzu çalıştırdığımda, içinde yalnızca bir öğe bulunan bir dizi alıyorum ... :-(
Mark Eirich
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.