Jak dołączyć jedną tablicę do drugiej bez porównywania ich kluczy?
$a = array( 'a', 'b' );
$b = array( 'c', 'd' );
Na koniec powinno być: Array( [0]=>a [1]=>b [2]=>c [3]=>d )
jeśli użyję czegoś takiego jak []
lub array_push
, spowoduje to jeden z następujących wyników:
Array( [0]=>a [1]=>b [2]=>Array( [0]=>c [1]=>d ) )
//or
Array( [0]=>c [1]=>d )
To powinno być coś, robi to, ale w bardziej elegancki sposób:
foreach ( $b AS $var )
$a[] = $var;
array_merge ($a, $b)
powinien robić dokładnie to, co chcesz, przynajmniej z PHP 5+.array_merge();
wyników niearray_merge();
powinno być dokładnie tym, czego potrzebujesz:print_r(array_merge($a,$b)); // outputs => Array ( [0] => a [1] => b [2] => c [3] => d )
Odpowiedzi:
array_merge
jest elegancki sposób:Robiąc coś takiego:
Nie będzie działać, ponieważ
+
operator tak naprawdę ich nie łączy. Jeśli mają$a
te same klucze$b
, nic nie zrobi.źródło
Innym sposobem na zrobienie tego w PHP 5.6+ jest użycie
...
tokenaBędzie to również działać z każdym
Traversable
Ostrzeżenie choć:
$b
jest pustą tablicą lub nie można jej przejść, np. nie jest tablicą$b
nie jest możliwe przejścieźródło
...
powszechnie określany jakosplat operator
php.array_push
akceptuje pojedynczy argument od php 7.3, co zapobiega błędom przy pustych tablicach.Dlaczego nie użyć?
Dlaczego nie chcesz użyć tej, poprawnej, wbudowanej metody.
źródło
PHP append one array to another (not array_merge or array_push)
… następnie zmodyfikowanePHP append one array to another (not array_merge or +)
przed zmianą na obecny tytułTo dość stary post, ale chcę dodać coś o dołączaniu jednej tablicy do drugiej:
Jeśli
możesz użyć funkcji tablicowych takich jak to:
array_merge nie scala kluczy numerycznych, więc dołącza wszystkie wartości $ appendArray. Używając natywnych funkcji php zamiast pętli foreach, powinno być szybsze na tablicach z dużą ilością elementów.
Dodatek 13.12.2019: Od wersji PHP 7.4 istnieje możliwość dołączania lub dodawania tablic w sposób Array Spread Operator:
Tak jak poprzednio, klucze mogą być problemem z tą nową funkcją:
„Błąd krytyczny: nieprzechwycony błąd: nie można rozpakować tablicy za pomocą kluczy łańcuchowych”
array (4) {[1] => int (1) [4] => int (2) [5] => int (3) [6] => int (4)}
array (3) {[0] => int (1) [1] => int (4) [3] => int (3)}
źródło
Wynik:
Referencyjny kod źródłowy
źródło
W przypadku dużej tablicy lepiej jest połączyć konkatencję bez array_merge, aby uniknąć kopiowania pamięci.
źródło
Po odpowiedziach od bstoney i Snarka wykonałem kilka testów różnych metod:
Który produkuje:
ORYGINAL: Wierzę, że od PHP 7 metoda 3 jest znacznie lepszą alternatywą ze względu na sposób działania pętli foreach , który polega na tworzeniu kopii iterowanej tablicy.
Podczas gdy metoda 3 nie jest ściśle odpowiedzią na kryteria „not array_push” w pytaniu, jest to jedna linia i najwyższa wydajność pod każdym względem, myślę, że pytanie zostało zadane, zanim ... składnia była opcją.
AKTUALIZACJA 25.03.2020: Zaktualizowałem test, który był wadliwy, ponieważ zmienne nie zostały zresetowane. Co ciekawe (lub myląco) wyniki pokazują teraz, że test 1 jest najszybszy, gdzie był najwolniejszy, od 0,008392 do 0,002717! Może to wynikać tylko z aktualizacji PHP, ponieważ nie miałby na to wpływu błąd testowy.
Tak więc saga trwa, odtąd zacznę używać array_merge!
źródło
Od PHP 7.4 można użyć ... operatora . Jest to również znane jako operator ikony w innych językach, w tym Ruby.
Wynik
Operator Splat powinien mieć lepszą wydajność niż array_merge . Nie tylko dlatego, że operator splat jest strukturą językową, podczas gdy array_merge jest funkcją, ale także dlatego, że optymalizacja czasu kompilacji może być wydajna dla stałych tablic.
Ponadto możemy używać składni operatora splat wszędzie w tablicy, ponieważ normalne elementy można dodawać przed lub po operatorze splat.
źródło
Przed PHP7 możesz użyć:
array_splice()
działa w odniesieniu do tablicy (1. argument) i umieszcza wartości tablicy (4. argument) w miejsce listy wartości rozpoczynanych od 2. argumentu i liczby 3. argumentu. Kiedy ustawiamy drugi argument jako koniec tablicy źródłowej, a trzeci jako zero, dołączamy 4. wartość argumentu do 1. argumentuźródło
jeśli chcesz scalić pustą tablicę z istniejącą nową wartością. Musisz go najpierw zainicjować.
Mam nadzieję, że to pomoże.
źródło
pętla foreach jest szybsza niż array_merge, aby dołączyć wartości do istniejącej tablicy, więc wybierz pętlę zamiast tego, jeśli chcesz dodać tablicę na końcu innej.
źródło
Co powiesz na to:
źródło
'0' => 'a'
... zamiast0 => 'a'
?array + array