Może się to okazać nieco bardziej intuicyjne. Wymaga tylko jednego wywołania funkcji, aby array_splice:
$original = array('a','b','c','d','e');
$inserted = array('x');// not necessarily an array, see manual quote
array_splice( $original,3,0, $inserted );// splice in at position 3// $original is now a b c x d e
Jeśli zamiana jest tylko jednym elementem, nie jest konieczne umieszczanie wokół niej tablicy (), chyba że elementem jest sama tablica, obiekt lub wartość NULL.
Dziwne, że taka podstawowa funkcjonalność jest w rzeczywistości ukryta, ponieważ głównym celem tej funkcji opisanym w dokumentacji jest coś innego (zamieniaj elementy w tablice). Tak, zostało to wskazane w sekcji argumentów, ale jeśli skanujesz tylko opisy funkcji w celu znalezienia, czego użyć do wstawienia do tablic, nigdy byś go nie znalazł.
Mahn
23
Wystarczy powiedzieć, że nie zachowa to kluczy w $insertedtablicy.
@JacerOmri jest całkowicie poprawne, oba oświadczenia są ważne. Możesz przekazać wartość dowolnego typu, ale może ona nie zachowywać się tak samo dla tablicy, obiektu lub wartości null. W przypadku skalarów rzutowanie typu (array)$scalarjest równoważne array($scalar), ale w przypadku tablicy, obiektu lub wartości null zostanie zignorowane (tablica), skonwertowane na tablicę (obiekt) lub stanie się pustą tablicą (null) - patrz php.net / manual / pl /…
Lukas
2
@SunilPachlangia, adelval i inne: z wielowymiarowymi tablicami musisz owinąć zamiennik w tablicę, jest to udokumentowane. Nadal przyniosłem wiadomość, żeby ludzie przestali popełniać błąd.
Félix Gagnon-Grenier
47
Funkcja, która może wstawiać zarówno liczby całkowite, jak i łańcuchowe:
array_splice()Traci klucze, natomiast array_merge()nie. Tak więc wyniki pierwszej funkcji mogą być bardzo zaskakujące ... Zwłaszcza, że jeśli masz dwa elementy z tym samym kluczem, zachowana zostanie tylko wartość ostatniego z nich ...
Chociaż jest szybszy i prawdopodobnie bardziej wydajny pod względem pamięci, jest to naprawdę odpowiednie tylko wtedy, gdy nie jest konieczne utrzymywanie kluczy tablicy.
Jeśli musisz zachować klucze, bardziej odpowiednie byłyby następujące;
function insertBefore($input, $index, $newKey, $element){if(!array_key_exists($index, $input)){thrownewException("Index not found");}
$tmpArray = array();foreach($input as $key => $value){if($key === $index){
$tmpArray[$newKey]= $element;}
$tmpArray[$key]= $value;}return $input;}function insertAfter($input, $index, $newKey, $element){if(!array_key_exists($index, $input)){thrownewException("Index not found");}
$tmpArray = array();foreach($input as $key => $value){
$tmpArray[$key]= $value;if($key === $index){
$tmpArray[$newKey]= $element;}}return $tmpArray;}
Jeśli chcesz zachować klucze początkowej tablicy, a także dodać tablicę zawierającą klucze, użyj poniższej funkcji:
function insertArrayAtPosition( $array, $insert, $position ){/*
$array : The initial array i want to modify
$insert : the new array i want to add, eg array('key' => 'value') or array('value')
$position : the position where the new array will be inserted into. Please mind that arrays start at 0
*/return array_slice($array,0, $position, TRUE)+ $insert + array_slice($array, $position, NULL, TRUE);}
Oto, co zadziałało w przypadku tablicy asocjacyjnej:
/*
* Inserts a new key/value after the key in the array.
*
* @param $key
* The key to insert after.
* @param $array
* An array to insert in to.
* @param $new_key
* The key to insert.
* @param $new_value
* An value to insert.
*
* @return
* The new array if the key exists, FALSE otherwise.
*
* @see array_insert_before()
*/function array_insert_after($key, array &$array, $new_key, $new_value){if(array_key_exists($key, $array)){
$new = array();foreach($array as $k => $value){
$new[$k]= $value;if($k === $key){
$new[$new_key]= $new_value;}}return $new;}return FALSE;}
Źródło funkcji - ten post na blogu . Istnieje również przydatna funkcja wstawiania PRZED konkretnym kluczem.
Rozwiązanie autorstwa jay.lee jest idealne. Jeśli chcesz dodać element (y) do tablicy wielowymiarowej, najpierw dodaj tablicę jednowymiarową, a następnie zastąp ją.
Dodanie elementu w tym samym formacie do tej tablicy spowoduje dodanie wszystkich nowych indeksów tablicy jako elementów zamiast po prostu elementu.
$new = array('title'=>'Time','width'=>10);
array_splice($original,1,0,array('random_string'));// can be more items
$original[1]= $new;// replaced with actual item
Uwaga: Dodanie elementów bezpośrednio do tablicy wielowymiarowej za pomocą array_splice doda wszystkie jej indeksy jako elementy zamiast tylko tego elementu.
Aby wstawić elementy do tablicy za pomocą kluczy łańcuchowych, możesz zrobić coś takiego:
/* insert an element after given array key
* $src = array() array to work with
* $ins = array() to insert in key=>array format
* $pos = key that $ins will be inserted after
*/function array_insert_string_keys($src,$ins,$pos){
$counter=1;foreach($src as $key=>$s){if($key==$pos){break;}
$counter++;}
$array_head = array_slice($src,0,$counter);
$array_tail = array_slice($src,$counter);
$src = array_merge($array_head, $ins);
$src = array_merge($src, $array_tail);return($src);}
Odpowiedzi:
Może się to okazać nieco bardziej intuicyjne. Wymaga tylko jednego wywołania funkcji, aby
array_splice
:źródło
$inserted
tablicy.(array)$scalar
jest równoważnearray($scalar)
, ale w przypadku tablicy, obiektu lub wartości null zostanie zignorowane (tablica), skonwertowane na tablicę (obiekt) lub stanie się pustą tablicą (null) - patrz php.net / manual / pl /…Funkcja, która może wstawiać zarówno liczby całkowite, jak i łańcuchowe:
Wykorzystanie liczby całkowitej:
Wykorzystanie ciągu:
źródło
array_splice()
Traci klucze, natomiastarray_merge()
nie. Tak więc wyniki pierwszej funkcji mogą być bardzo zaskakujące ... Zwłaszcza, że jeśli masz dwa elementy z tym samym kluczem, zachowana zostanie tylko wartość ostatniego z nich ...źródło
+
zamiastarray_merge
może zachować kluczeW ten sposób możesz wstawiać tablice:
źródło
Nie ma natywnej funkcji PHP (o której wiem), która mogłaby zrobić dokładnie to, o co prosiłeś.
Napisałem 2 metody, które moim zdaniem są odpowiednie do celu:
Chociaż jest szybszy i prawdopodobnie bardziej wydajny pod względem pamięci, jest to naprawdę odpowiednie tylko wtedy, gdy nie jest konieczne utrzymywanie kluczy tablicy.
Jeśli musisz zachować klucze, bardziej odpowiednie byłyby następujące;
źródło
insertBefore()
powinieneś powrócić$tmpArray
zamiast$input
.W oparciu o świetną odpowiedź @Halil, oto prosta funkcja, jak wstawić nowy element po określonym kluczu, zachowując klucze całkowite:
źródło
Jeśli chcesz zachować klucze początkowej tablicy, a także dodać tablicę zawierającą klucze, użyj poniższej funkcji:
Przykład połączenia:
źródło
źródło
Oto, co zadziałało w przypadku tablicy asocjacyjnej:
Źródło funkcji - ten post na blogu . Istnieje również przydatna funkcja wstawiania PRZED konkretnym kluczem.
źródło
Jest to również działające rozwiązanie:
kredyty przejdź do: http://binarykitten.com/php/52-php-insert-element-and-shift.html
źródło
Rozwiązanie autorstwa jay.lee jest idealne. Jeśli chcesz dodać element (y) do tablicy wielowymiarowej, najpierw dodaj tablicę jednowymiarową, a następnie zastąp ją.
Dodanie elementu w tym samym formacie do tej tablicy spowoduje dodanie wszystkich nowych indeksów tablicy jako elementów zamiast po prostu elementu.
Uwaga: Dodanie elementów bezpośrednio do tablicy wielowymiarowej za pomocą array_splice doda wszystkie jej indeksy jako elementy zamiast tylko tego elementu.
źródło
Możesz tego użyć
źródło
Zwykle z wartościami skalarnymi:
Aby wstawić pojedynczy element tablicy do tablicy, nie zapomnij owinąć tablicy w tablicę (ponieważ była to wartość skalarna!):
w przeciwnym razie wszystkie klucze tablicy zostaną dodane kawałek po kawałku.
źródło
Wskazówka dotycząca dodawania elementu na początku tablicy :
następnie:
ale:
źródło
array_unshift($a,'i am the new first element');
jeśli nie jesteś pewien, NIE UŻYWAJ TEGO :
LUB
ponieważ + oryginalna tablica zostanie zastąpiona. ( patrz źródło )
źródło
Spróbuj tego:
źródło
Przykład połączenia:
źródło
Aby wstawić elementy do tablicy za pomocą kluczy łańcuchowych, możesz zrobić coś takiego:
źródło
$src = array_merge($array_head, $ins, $array_tail);
?