Nasıl verimli bir PHP dizi elemanı (anahtar veya işaretçi) tarafından bilinen bir başka sonra öğe eklemek için?

5 Cevap php

Bir dizi Verilen:

$a = array(
    'abc',
    123,
    'k1'=>'v1',
    'k2'=>'v2',
    78,
    'tt',
    'k3'=>'v3'
);

With its internal pointer on one of its elements, how do I insert an element after the current element? And how do I insert an element after a key-known element, say 'k1'?

Performans Bakım ~

5 Cevap

Sen array_keys ve array_values, ardından ikisini de kesikler kullanarak diziyi bölerek bunu yapabilirdi, daha sonra tekrar bunları birleştirmek.

$insertKey = 'k1';

$keys = array_keys($arr);
$vals = array_values($arr);

$insertAfter = array_search($insertKey, $keys) + 1;

$keys2 = array_splice($keys, $insertAfter);
$vals2 = array_splice($vals, $insertAfter);

$keys[] = "myNewKey";
$vals[] = "myNewValue";

$newArray = array_merge(array_combine($keys, $vals), array_combine($keys2, $vals2));

Sen elemanları eklemek için dahili dizi işaretçi kullanamazsınız.

Orada array_splice hangi unsurları ve Altdizilim değiştirin / / kaldırma ekleyebilirsiniz, ancak tamsayı endeksli diziler için tasarlanmıştır oluyor.

Ben size (ilk / son öğe eklemek istediğiniz durumlar hariç) öğe eklemek için diziyi yeniden veya istediğiniz sırayla anahtarları tutmak için ayrı tamsayı endeksli dizi kullanmak gerekecek korkuyorum.

Bu yol tuşları olmadan yeni değerler için gayet iyi. Sen bir anahtar ile değer eklemek edemez, ve sayısal indeksler N-1, 0 olarak 'reset' olacaktır.

$keys = array_keys($a);
$index = array_flip($keys);

$key = key($a); //current element
//or 
$key = 'k1';

array_splice($a, $index[$key] + 1, 0, array('value'));

Genellikle iki kat bağlantılı liste konuşan bu görev için ideal olacaktır.

Orada bile SplDoublyLinkedList denilen PHP 5.3 beri bir uygulama olduğunu, ancak ne yazık ki bu bir anda yöntemler / gelen yerde ortasında düğümleri eklemek / kaldırmak için eksik.

Yani, şimdi sen dizi yapıştırma başvurmak zorunda.

Burada size yardımcı olacak güzel bir işlevi var: https://gist.github.com/scribu/588429